Whitespace normalization.  Ran reindent.py over the entire source tree.
diff --git a/Demo/curses/life.py b/Demo/curses/life.py
index 4ce09d2..a787e26 100755
--- a/Demo/curses/life.py
+++ b/Demo/curses/life.py
@@ -11,7 +11,7 @@
 #  Cursor keys :  Move the cursor around the board
 #  Space or Enter : Toggle the contents of the cursor's position
 #
-# TODO : 
+# TODO :
 #   Support the mouse
 #   Use colour if available
 #   Make board updates faster
@@ -26,11 +26,11 @@
     Attributes:
     X,Y : horizontal and vertical size of the board
     state : dictionary mapping (x,y) to 0 or 1
-    
+
     Methods:
-    display(update_board) -- If update_board is true, compute the 
+    display(update_board) -- If update_board is true, compute the
                              next generation.  Then display the state
-			     of the board and refresh the screen.
+                             of the board and refresh the screen.
     erase() -- clear the entire board
     makeRandom() -- fill the board randomly
     set(y,x) -- set the given cell to Live; doesn't refresh the screen
@@ -39,90 +39,90 @@
 
     """
     def __init__(self, scr, char=ord('*')):
-	"""Create a new LifeBoard instance.
+        """Create a new LifeBoard instance.
 
-	scr -- curses screen object to use for display
-	char -- character used to render live cells (default: '*')
-	"""
-	self.state={} ; self.scr=scr
-	Y, X = self.scr.getmaxyx()
-	self.X, self.Y = X-2, Y-2-1
-	self.char = char
-	self.scr.clear()	
+        scr -- curses screen object to use for display
+        char -- character used to render live cells (default: '*')
+        """
+        self.state={} ; self.scr=scr
+        Y, X = self.scr.getmaxyx()
+        self.X, self.Y = X-2, Y-2-1
+        self.char = char
+        self.scr.clear()
 
-	# Draw a border around the board
-	border_line='+'+(self.X*'-')+'+'
-	self.scr.addstr(0, 0, border_line)
-	self.scr.addstr(self.Y+1,0, border_line)
-	for y in range(0, self.Y): 
-	    self.scr.addstr(1+y, 0, '|') 
-	    self.scr.addstr(1+y, self.X+1, '|')
-	self.scr.refresh()
+        # Draw a border around the board
+        border_line='+'+(self.X*'-')+'+'
+        self.scr.addstr(0, 0, border_line)
+        self.scr.addstr(self.Y+1,0, border_line)
+        for y in range(0, self.Y):
+            self.scr.addstr(1+y, 0, '|')
+            self.scr.addstr(1+y, self.X+1, '|')
+        self.scr.refresh()
 
-    def set(self, y, x): 
-	"""Set a cell to the live state"""
-	if x<0 or self.X<=x or y<0 or self.Y<=y:
-	    raise ValueError, "Coordinates out of range %i,%i"% (y,x)
-	self.state[x,y] = 1
+    def set(self, y, x):
+        """Set a cell to the live state"""
+        if x<0 or self.X<=x or y<0 or self.Y<=y:
+            raise ValueError, "Coordinates out of range %i,%i"% (y,x)
+        self.state[x,y] = 1
 
-    def toggle(self, y, x): 
-	"""Toggle a cell's state between live and dead"""
-	if x<0 or self.X<=x or y<0 or self.Y<=y:
-	    raise ValueError, "Coordinates out of range %i,%i"% (y,x)
-	if self.state.has_key( (x,y) ): 
-	    del self.state[x,y]
-	    self.scr.addch(y+1, x+1, ' ')
-	else:
-	    self.state[x,y]=1
-	    self.scr.addch(y+1, x+1, self.char)
-	self.scr.refresh()
+    def toggle(self, y, x):
+        """Toggle a cell's state between live and dead"""
+        if x<0 or self.X<=x or y<0 or self.Y<=y:
+            raise ValueError, "Coordinates out of range %i,%i"% (y,x)
+        if self.state.has_key( (x,y) ):
+            del self.state[x,y]
+            self.scr.addch(y+1, x+1, ' ')
+        else:
+            self.state[x,y]=1
+            self.scr.addch(y+1, x+1, self.char)
+        self.scr.refresh()
 
     def erase(self):
-	"""Clear the entire board and update the board display"""
-	self.state={}
-	self.display(update_board=0)
+        """Clear the entire board and update the board display"""
+        self.state={}
+        self.display(update_board=0)
 
     def display(self, update_board=1):
-	"""Display the whole board, optionally computing one generation"""
-	M,N = self.X, self.Y 
-	if not update_board:
-	    for i in range(0, M):
-		for j in range(0, N):
-			if self.state.has_key( (i,j) ): 
-			    self.scr.addch(j+1, i+1, self.char)
-			else:
-			    self.scr.addch(j+1, i+1, ' ')
-	    self.scr.refresh()
-	    return
+        """Display the whole board, optionally computing one generation"""
+        M,N = self.X, self.Y
+        if not update_board:
+            for i in range(0, M):
+                for j in range(0, N):
+                    if self.state.has_key( (i,j) ):
+                        self.scr.addch(j+1, i+1, self.char)
+                    else:
+                        self.scr.addch(j+1, i+1, ' ')
+            self.scr.refresh()
+            return
 
-	d={} ; self.boring=1
-	for i in range(0, M):
-	    L=range( max(0, i-1), min(M, i+2) )
-	    for j in range(0, N):
-		s=0
-		live=self.state.has_key( (i,j) )
-		for k in range( max(0, j-1), min(N, j+2) ):
-		    for l in L:
-			if self.state.has_key( (l,k) ):
-			    s=s+1
-		s=s-live
-		if s==3: 
-		    # Birth
-		    d[i,j]=1 
-		    self.scr.addch(j+1, i+1, self.char)
-		    if not live: self.boring=0  
-		elif s==2 and live: d[i,j]=1       # Survival
-		elif live: 
-		    # Death
-		    self.scr.addch(j+1, i+1, ' ')
-		    self.boring=0
-	self.state=d
-	self.scr.refresh()
+        d={} ; self.boring=1
+        for i in range(0, M):
+            L=range( max(0, i-1), min(M, i+2) )
+            for j in range(0, N):
+                s=0
+                live=self.state.has_key( (i,j) )
+                for k in range( max(0, j-1), min(N, j+2) ):
+                    for l in L:
+                        if self.state.has_key( (l,k) ):
+                            s=s+1
+                s=s-live
+                if s==3:
+                    # Birth
+                    d[i,j]=1
+                    self.scr.addch(j+1, i+1, self.char)
+                    if not live: self.boring=0
+                elif s==2 and live: d[i,j]=1       # Survival
+                elif live:
+                    # Death
+                    self.scr.addch(j+1, i+1, ' ')
+                    self.boring=0
+        self.state=d
+        self.scr.refresh()
 
     def makeRandom(self):
-	"Fill the board with a random pattern"
-	self.state={}
-	for i in range(0, self.X): 
+        "Fill the board with a random pattern"
+        self.state={}
+        for i in range(0, self.X):
             for j in range(0, self.Y):
                 if random.random() > 0.5: self.set(j,i)
 
@@ -149,7 +149,7 @@
     display_menu(stdscr, menu_y)
 
     # Allocate a subwindow for the Life board and create the board object
-    subwin=stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0) 
+    subwin=stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0)
     board=LifeBoard(subwin, char=ord('*'))
     board.display(update_board=0)
 
@@ -158,66 +158,65 @@
 
     # Main loop:
     while (1):
-	stdscr.move(1+ypos, 1+xpos)     # Move the cursor
-	c=stdscr.getch()		# Get a keystroke
-	if 0<c<256:
-	    c=chr(c)
-	    if c in ' \n':
-		board.toggle(ypos, xpos)
-	    elif c in 'Cc':
-		erase_menu(stdscr, menu_y)
-		stdscr.addstr(menu_y, 6, ' Hit any key to stop continuously '
-			      'updating the screen.')
-		stdscr.refresh()
-		# Activate nodelay mode; getch() will return -1
-		# if no keystroke is available, instead of waiting.
-		stdscr.nodelay(1)   
-		while (1):
-		    c=stdscr.getch()
-		    if c!=-1: break
-		    stdscr.addstr(0,0, '/'); stdscr.refresh()
-		    board.display()
-		    stdscr.addstr(0,0, '+'); stdscr.refresh()
+        stdscr.move(1+ypos, 1+xpos)     # Move the cursor
+        c=stdscr.getch()                # Get a keystroke
+        if 0<c<256:
+            c=chr(c)
+            if c in ' \n':
+                board.toggle(ypos, xpos)
+            elif c in 'Cc':
+                erase_menu(stdscr, menu_y)
+                stdscr.addstr(menu_y, 6, ' Hit any key to stop continuously '
+                              'updating the screen.')
+                stdscr.refresh()
+                # Activate nodelay mode; getch() will return -1
+                # if no keystroke is available, instead of waiting.
+                stdscr.nodelay(1)
+                while (1):
+                    c=stdscr.getch()
+                    if c!=-1: break
+                    stdscr.addstr(0,0, '/'); stdscr.refresh()
+                    board.display()
+                    stdscr.addstr(0,0, '+'); stdscr.refresh()
 
-		stdscr.nodelay(0)	# Disable nodelay mode
-		display_menu(stdscr, menu_y)
+                stdscr.nodelay(0)       # Disable nodelay mode
+                display_menu(stdscr, menu_y)
 
-	    elif c in 'Ee': board.erase()
-	    elif c in 'Qq': break
-	    elif c in 'Rr': 
-		board.makeRandom()
-		board.display(update_board=0)
-	    elif c in 'Ss':
-		board.display()
-	    else: pass                  # Ignore incorrect keys
-	elif c==curses.KEY_UP and ypos>0: 	     ypos=ypos-1
-	elif c==curses.KEY_DOWN and ypos<board.Y-1:  ypos=ypos+1
-	elif c==curses.KEY_LEFT and xpos>0:          xpos=xpos-1
-	elif c==curses.KEY_RIGHT and xpos<board.X-1: xpos=xpos+1
-        else: pass			# Ignore incorrect keys
+            elif c in 'Ee': board.erase()
+            elif c in 'Qq': break
+            elif c in 'Rr':
+                board.makeRandom()
+                board.display(update_board=0)
+            elif c in 'Ss':
+                board.display()
+            else: pass                  # Ignore incorrect keys
+        elif c==curses.KEY_UP and ypos>0:            ypos=ypos-1
+        elif c==curses.KEY_DOWN and ypos<board.Y-1:  ypos=ypos+1
+        elif c==curses.KEY_LEFT and xpos>0:          xpos=xpos-1
+        elif c==curses.KEY_RIGHT and xpos<board.X-1: xpos=xpos+1
+        else: pass                      # Ignore incorrect keys
 
 if __name__=='__main__':
     try:
-	# Initialize curses
-	stdscr=curses.initscr()
-	# Turn off echoing of keys, and enter cbreak mode,
-	# where no buffering is performed on keyboard input
-	curses.noecho() ; curses.cbreak()
+        # Initialize curses
+        stdscr=curses.initscr()
+        # Turn off echoing of keys, and enter cbreak mode,
+        # where no buffering is performed on keyboard input
+        curses.noecho() ; curses.cbreak()
 
-	# In keypad mode, escape sequences for special keys
-	# (like the cursor keys) will be interpreted and
-	# a special value like curses.KEY_LEFT will be returned
-	stdscr.keypad(1)
-	main(stdscr)			# Enter the main loop
-	# Set everything back to normal
-	stdscr.keypad(0)
-	curses.echo() ; curses.nocbreak()
-	curses.endwin()			# Terminate curses
+        # In keypad mode, escape sequences for special keys
+        # (like the cursor keys) will be interpreted and
+        # a special value like curses.KEY_LEFT will be returned
+        stdscr.keypad(1)
+        main(stdscr)                    # Enter the main loop
+        # Set everything back to normal
+        stdscr.keypad(0)
+        curses.echo() ; curses.nocbreak()
+        curses.endwin()                 # Terminate curses
     except:
         # In the event of an error, restore the terminal
-	# to a sane state.
-	stdscr.keypad(0)
-	curses.echo() ; curses.nocbreak()
-	curses.endwin()
-	traceback.print_exc()		# Print the exception
-
+        # to a sane state.
+        stdscr.keypad(0)
+        curses.echo() ; curses.nocbreak()
+        curses.endwin()
+        traceback.print_exc()           # Print the exception
diff --git a/Demo/curses/ncurses.py b/Demo/curses/ncurses.py
index 96aa142..c9394d0 100644
--- a/Demo/curses/ncurses.py
+++ b/Demo/curses/ncurses.py
@@ -209,7 +209,7 @@
             w5.addstr(mod[itmp])
             pflush()
             wait_a_while()
-            
+
             saywhat("m5; press any key to continue")
             w4.move(curses.LINES / 6, 1)
             w4.addstr(mod[itmp])
@@ -218,7 +218,7 @@
             w5.addstr(mod[itmp])
             pflush()
             wait_a_while()
-            
+
         saywhat("m4; press any key to continue")
         p4.move(curses.LINES / 6, (itmp + 1) * curses.COLS / 8)
         pflush()
diff --git a/Demo/curses/rain.py b/Demo/curses/rain.py
index 2399d7f..69794b3 100644
--- a/Demo/curses/rain.py
+++ b/Demo/curses/rain.py
@@ -27,18 +27,18 @@
     # Initialize it globally for convenience.
     global stdscr
     stdscr = win
-    
+
     if curses.has_colors():
         bg = curses.COLOR_BLACK
         curses.init_pair(1, curses.COLOR_BLUE, bg)
         curses.init_pair(2, curses.COLOR_CYAN, bg)
-    
+
     curses.nl()
     curses.noecho()
     # XXX curs_set() always returns ERR
     # curses.curs_set(0)
     stdscr.timeout(0)
-    
+
     c = curses.COLS - 4
     r = curses.LINES - 4
     xpos = [0] * c
@@ -46,38 +46,38 @@
     for j in range(4, -1, -1):
         xpos[j] = randrange(0, c) + 2
         ypos[j] = randrange(0, r) + 2
-    
+
     j = 0
     while 1:
         x = randrange(0, c) + 2
         y = randrange(0, r) + 2
-        
+
         stdscr.addch(y, x, ord('.'))
-        
+
         stdscr.addch(ypos[j], xpos[j], ord('o'))
-        
+
         j = next_j(j)
         stdscr.addch(ypos[j], xpos[j], ord('O'))
-        
+
         j = next_j(j)
         stdscr.addch( ypos[j] - 1, xpos[j],     ord('-'))
         stdscr.addstr(ypos[j],     xpos[j] - 1, "|.|")
         stdscr.addch( ypos[j] + 1, xpos[j],     ord('-'))
-        
+
         j = next_j(j)
         stdscr.addch( ypos[j] - 2, xpos[j],     ord('-'))
         stdscr.addstr(ypos[j] - 1, xpos[j] - 1, "/ \\")
         stdscr.addstr(ypos[j],     xpos[j] - 2, "| O |")
         stdscr.addstr(ypos[j] + 1, xpos[j] - 1, "\\ /")
         stdscr.addch( ypos[j] + 2, xpos[j],     ord('-'))
-        
+
         j = next_j(j)
         stdscr.addch( ypos[j] - 2, xpos[j],     ord(' '))
         stdscr.addstr(ypos[j] - 1, xpos[j] - 1, "   ")
         stdscr.addstr(ypos[j],     xpos[j] - 2, "     ")
         stdscr.addstr(ypos[j] + 1, xpos[j] - 1, "   ")
         stdscr.addch( ypos[j] + 2, xpos[j],     ord(' '))
-        
+
         xpos[j] = x
         ypos[j] = y
 
@@ -90,5 +90,5 @@
             stdscr.nodelay(1)
 
         curses.napms(50)
-        
+
 curses.wrapper(main)
diff --git a/Demo/curses/tclock.py b/Demo/curses/tclock.py
index f423e9a..1950043 100644
--- a/Demo/curses/tclock.py
+++ b/Demo/curses/tclock.py
@@ -66,7 +66,7 @@
 def main(win):
     global stdscr
     stdscr = win
-    
+
     lastbeep = -1
     my_bg = curses.COLOR_BLACK
 
@@ -80,7 +80,7 @@
 
     cx = (curses.COLS - 1) / 2
     cy = curses.LINES / 2
-    ch = min( cy-1, int(cx / ASPECT) - 1) 
+    ch = min( cy-1, int(cx / ASPECT) - 1)
     mradius = (3 * ch) / 4
     hradius = ch / 2
     sradius = 5 * ch / 6
@@ -95,7 +95,7 @@
                   "ASCII Clock by Howard Jones <ha.jones@ic.ac.uk>, 1994")
 
     sradius = max(sradius-4, 8)
-    
+
     while 1:
         curses.napms(1000)
 
@@ -125,7 +125,7 @@
             stdscr.attrset(curses.color_pair(1))
 
         plot(cx + sdx, cy - sdy, ord('O'))
-        
+
         if curses.has_colors():
             stdscr.attrset(curses.color_pair(0))
 
diff --git a/Demo/curses/xmas.py b/Demo/curses/xmas.py
index 99c7087..e51bc5f 100644
--- a/Demo/curses/xmas.py
+++ b/Demo/curses/xmas.py
@@ -66,9 +66,9 @@
     stdscr.addch(14, 1, ord('N'))
     stdscr.addch(16, 1, ord("'"))
     stdscr.addch(18, 1, ord('S'))
-    
+
     return
-    
+
 def greet():
     stdscr.addch(3, 5, ord('G'))
     stdscr.addch(5, 5, ord('R'))
@@ -300,7 +300,7 @@
             break
 
         treescrn8.touchwin()
-    
+
     # ALL ON
     treescrn.overlay(treescrn8)
     treescrn8.refresh()
@@ -347,10 +347,10 @@
             else:
                 dotdeer0.addch(y_pos, x_pos, ord('*'))
                 dotdeer0.refresh()
-		w_del_msg.refresh()
-		dotdeer0.erase()
-		dotdeer0.refresh()
-		w_del_msg.refresh()
+                w_del_msg.refresh()
+                dotdeer0.erase()
+                dotdeer0.refresh()
+                w_del_msg.refresh()
 
     x_pos = 58
 
@@ -360,76 +360,76 @@
         w_del_msg.refresh()
 
         for looper in range(0, 4):
-	    deer_step(lildeer3, y_pos, x_pos)
-	    deer_step(lildeer2, y_pos, x_pos)
-	    deer_step(lildeer1, y_pos, x_pos)
-	    deer_step(lildeer2, y_pos, x_pos)
-	    deer_step(lildeer3, y_pos, x_pos)
+            deer_step(lildeer3, y_pos, x_pos)
+            deer_step(lildeer2, y_pos, x_pos)
+            deer_step(lildeer1, y_pos, x_pos)
+            deer_step(lildeer2, y_pos, x_pos)
+            deer_step(lildeer3, y_pos, x_pos)
 
-	    lildeer0.touchwin()
-	    lildeer0.refresh()
-	    w_del_msg.refresh()
+            lildeer0.touchwin()
+            lildeer0.refresh()
+            w_del_msg.refresh()
 
-	    x_pos -= 2
+            x_pos -= 2
 
     x_pos = 35
 
     for y_pos in range(5, 10):
 
-	middeer0.touchwin()
-	middeer0.refresh()
-	w_del_msg.refresh()
+        middeer0.touchwin()
+        middeer0.refresh()
+        w_del_msg.refresh()
 
         for looper in range(0, 2):
-	    deer_step(middeer3, y_pos, x_pos)
-	    deer_step(middeer2, y_pos, x_pos)
-	    deer_step(middeer1, y_pos, x_pos)
-	    deer_step(middeer2, y_pos, x_pos)
-	    deer_step(middeer3, y_pos, x_pos)
+            deer_step(middeer3, y_pos, x_pos)
+            deer_step(middeer2, y_pos, x_pos)
+            deer_step(middeer1, y_pos, x_pos)
+            deer_step(middeer2, y_pos, x_pos)
+            deer_step(middeer3, y_pos, x_pos)
 
-	    middeer0.touchwin()
-	    middeer0.refresh()
-	    w_del_msg.refresh()
+            middeer0.touchwin()
+            middeer0.refresh()
+            w_del_msg.refresh()
 
-	    x_pos -= 3
+            x_pos -= 3
 
     look_out(300)
 
     y_pos = 1
 
     for x_pos in range(8, 16):
-	deer_step(bigdeer4, y_pos, x_pos)
-	deer_step(bigdeer3, y_pos, x_pos)
-	deer_step(bigdeer2, y_pos, x_pos)
-	deer_step(bigdeer1, y_pos, x_pos)
-	deer_step(bigdeer2, y_pos, x_pos)
-	deer_step(bigdeer3, y_pos, x_pos)
-	deer_step(bigdeer4, y_pos, x_pos)
-	deer_step(bigdeer0, y_pos, x_pos)
+        deer_step(bigdeer4, y_pos, x_pos)
+        deer_step(bigdeer3, y_pos, x_pos)
+        deer_step(bigdeer2, y_pos, x_pos)
+        deer_step(bigdeer1, y_pos, x_pos)
+        deer_step(bigdeer2, y_pos, x_pos)
+        deer_step(bigdeer3, y_pos, x_pos)
+        deer_step(bigdeer4, y_pos, x_pos)
+        deer_step(bigdeer0, y_pos, x_pos)
 
     x_pos -= 1
 
     for looper in range(0, 6):
-	deer_step(lookdeer4, y_pos, x_pos)
-	deer_step(lookdeer3, y_pos, x_pos)
-	deer_step(lookdeer2, y_pos, x_pos)
-	deer_step(lookdeer1, y_pos, x_pos)
-	deer_step(lookdeer2, y_pos, x_pos)
-	deer_step(lookdeer3, y_pos, x_pos)
-	deer_step(lookdeer4, y_pos, x_pos)
+        deer_step(lookdeer4, y_pos, x_pos)
+        deer_step(lookdeer3, y_pos, x_pos)
+        deer_step(lookdeer2, y_pos, x_pos)
+        deer_step(lookdeer1, y_pos, x_pos)
+        deer_step(lookdeer2, y_pos, x_pos)
+        deer_step(lookdeer3, y_pos, x_pos)
+        deer_step(lookdeer4, y_pos, x_pos)
 
     deer_step(lookdeer0, y_pos, x_pos)
 
     for y_pos in range(y_pos, 10):
         for looper in range(0, 2):
-	    deer_step(bigdeer4, y_pos, x_pos)
-	    deer_step(bigdeer3, y_pos, x_pos)
-	    deer_step(bigdeer2, y_pos, x_pos)
-	    deer_step(bigdeer1, y_pos, x_pos)
-	    deer_step(bigdeer2, y_pos, x_pos)
-	    deer_step(bigdeer3, y_pos, x_pos)
-	    deer_step(bigdeer4, y_pos, x_pos)
-	deer_step(bigdeer0, y_pos, x_pos)
+            deer_step(bigdeer4, y_pos, x_pos)
+            deer_step(bigdeer3, y_pos, x_pos)
+            deer_step(bigdeer2, y_pos, x_pos)
+            deer_step(bigdeer1, y_pos, x_pos)
+            deer_step(bigdeer2, y_pos, x_pos)
+            deer_step(bigdeer3, y_pos, x_pos)
+            deer_step(bigdeer4, y_pos, x_pos)
+        deer_step(bigdeer0, y_pos, x_pos)
 
     y_pos -= 1
 
@@ -439,7 +439,7 @@
 def main(win):
     global stdscr
     stdscr = win
-    
+
     global my_bg, y_pos, x_pos
     global treescrn, treescrn2, treescrn3, treescrn4
     global treescrn5, treescrn6, treescrn7, treescrn8
@@ -452,7 +452,7 @@
 
     my_bg = curses.COLOR_BLACK
     # curses.curs_set(0)
-    
+
     treescrn = curses.newwin(16, 27, 3, 53)
     treescrn2 = curses.newwin(16, 27, 3, 53)
     treescrn3 = curses.newwin(16, 27, 3, 53)
@@ -461,37 +461,37 @@
     treescrn6 = curses.newwin(16, 27, 3, 53)
     treescrn7 = curses.newwin(16, 27, 3, 53)
     treescrn8 = curses.newwin(16, 27, 3, 53)
-    
+
     dotdeer0 = curses.newwin(3, 71, 0, 8)
-    
+
     stardeer0 = curses.newwin(4, 56, 0, 8)
-    
+
     lildeer0 = curses.newwin(7, 53, 0, 8)
     lildeer1 = curses.newwin(2, 4, 0, 0)
     lildeer2 = curses.newwin(2, 4, 0, 0)
     lildeer3 = curses.newwin(2, 4, 0, 0)
-    
+
     middeer0 = curses.newwin(15, 42, 0, 8)
     middeer1 = curses.newwin(3, 7, 0, 0)
     middeer2 = curses.newwin(3, 7, 0, 0)
     middeer3 = curses.newwin(3, 7, 0, 0)
-    
+
     bigdeer0 = curses.newwin(10, 23, 0, 0)
     bigdeer1 = curses.newwin(10, 23, 0, 0)
     bigdeer2 = curses.newwin(10, 23, 0, 0)
     bigdeer3 = curses.newwin(10, 23, 0, 0)
     bigdeer4 = curses.newwin(10, 23, 0, 0)
-    
+
     lookdeer0 = curses.newwin(10, 25, 0, 0)
     lookdeer1 = curses.newwin(10, 25, 0, 0)
     lookdeer2 = curses.newwin(10, 25, 0, 0)
     lookdeer3 = curses.newwin(10, 25, 0, 0)
     lookdeer4 = curses.newwin(10, 25, 0, 0)
-    
+
     w_holiday = curses.newwin(1, 27, 3, 27)
-    
+
     w_del_msg = curses.newwin(1, 20, 23, 60)
-    
+
     try:
         w_del_msg.addstr(0, 0, "Hit any key to quit")
     except curses.error:
@@ -501,7 +501,7 @@
         w_holiday.addstr(0, 0, "H A P P Y  H O L I D A Y S")
     except curses.error:
         pass
-    
+
     # set up the windows for our various reindeer
     lildeer1.addch(0, 0, ord('V'))
     lildeer1.addch(1, 0, ord('@'))
@@ -511,7 +511,7 @@
         lildeer1.addch(1, 3, ord('~'))
     except curses.error:
         pass
-    
+
     lildeer2.addch(0, 0, ord('V'))
     lildeer2.addch(1, 0, ord('@'))
     lildeer2.addch(1, 1, ord('|'))
@@ -520,16 +520,16 @@
         lildeer2.addch(1, 3, ord('~'))
     except curses.error:
         pass
-    
+
     lildeer3.addch(0, 0, ord('V'))
     lildeer3.addch(1, 0, ord('@'))
     lildeer3.addch(1, 1, ord('>'))
     lildeer3.addch(1, 2, ord('<'))
     try:
-        lildeer2.addch(1, 3, ord('~'))	# XXX
+        lildeer2.addch(1, 3, ord('~'))  # XXX
     except curses.error:
         pass
-    
+
     middeer1.addch(0, 2, ord('y'))
     middeer1.addch(0, 3, ord('y'))
     middeer1.addch(1, 2, ord('0'))
@@ -539,7 +539,7 @@
     middeer1.addch(1, 6, ord('~'))
     middeer1.addch(2, 3, ord('\\'))
     middeer1.addch(2, 5, ord('/'))
-    
+
     middeer2.addch(0, 2, ord('y'))
     middeer2.addch(0, 3, ord('y'))
     middeer2.addch(1, 2, ord('0'))
@@ -549,7 +549,7 @@
     middeer2.addch(1, 6, ord('~'))
     middeer2.addch(2, 3, ord('|'))
     middeer2.addch(2, 5, ord('|'))
-    
+
     middeer3.addch(0, 2, ord('y'))
     middeer3.addch(0, 3, ord('y'))
     middeer3.addch(1, 2, ord('0'))
@@ -577,11 +577,11 @@
     bigdeer1.addch(4, 19, ord('\\'))
     bigdeer1.addch(4, 22, ord('\\'))
     bigdeer1.addstr(5, 7, "^~~~~~~~~//  ~~U")
-    bigdeer1.addstr(6, 7, "( \\_____( /")	# ))
+    bigdeer1.addstr(6, 7, "( \\_____( /")       # ))
     bigdeer1.addstr(7, 8, "( )    /")
     bigdeer1.addstr(8, 9, "\\\\   /")
     bigdeer1.addstr(9, 11, "\\>/>")
-    
+
     bigdeer2.addch(0, 17, ord('\\'))
     bigdeer2.addch(0, 18, ord('/'))
     bigdeer2.addch(0, 19, ord('\\'))
@@ -599,11 +599,11 @@
     bigdeer2.addch(4, 19, ord('\\'))
     bigdeer2.addch(4, 22, ord('\\'))
     bigdeer2.addstr(5, 7, "^~~~~~~~~//  ~~U")
-    bigdeer2.addstr(6, 7, "(( )____( /")	# ))
+    bigdeer2.addstr(6, 7, "(( )____( /")        # ))
     bigdeer2.addstr(7, 7, "( /    |")
     bigdeer2.addstr(8, 8, "\\/    |")
     bigdeer2.addstr(9, 9, "|>   |>")
-    
+
     bigdeer3.addch(0, 17, ord('\\'))
     bigdeer3.addch(0, 18, ord('/'))
     bigdeer3.addch(0, 19, ord('\\'))
@@ -621,11 +621,11 @@
     bigdeer3.addch(4, 19, ord('\\'))
     bigdeer3.addch(4, 22, ord('\\'))
     bigdeer3.addstr(5, 7, "^~~~~~~~~//  ~~U")
-    bigdeer3.addstr(6, 6, "( ()_____( /")	# ))
+    bigdeer3.addstr(6, 6, "( ()_____( /")       # ))
     bigdeer3.addstr(7, 6, "/ /       /")
     bigdeer3.addstr(8, 5, "|/          \\")
     bigdeer3.addstr(9, 5, "/>           \\>")
-    
+
     bigdeer4.addch(0, 17, ord('\\'))
     bigdeer4.addch(0, 18, ord('/'))
     bigdeer4.addch(0, 19, ord('\\'))
@@ -643,51 +643,51 @@
     bigdeer4.addch(4, 19, ord('\\'))
     bigdeer4.addch(4, 22, ord('\\'))
     bigdeer4.addstr(5, 7, "^~~~~~~~~//  ~~U")
-    bigdeer4.addstr(6, 6, "( )______( /")	# )
-    bigdeer4.addstr(7, 5, "(/          \\")	# )
+    bigdeer4.addstr(6, 6, "( )______( /")       # )
+    bigdeer4.addstr(7, 5, "(/          \\")     # )
     bigdeer4.addstr(8, 0, "v___=             ----^")
-    
+
     lookdeer1.addstr(0, 16, "\\/     \\/")
     lookdeer1.addstr(1, 17, "\\Y/ \\Y/")
     lookdeer1.addstr(2, 19, "\\=/")
     lookdeer1.addstr(3, 17, "^\\o o/^")
     lookdeer1.addstr(4, 17, "//( )")
     lookdeer1.addstr(5, 7, "^~~~~~~~~// \\O/")
-    lookdeer1.addstr(6, 7, "( \\_____( /")	# ))
+    lookdeer1.addstr(6, 7, "( \\_____( /")      # ))
     lookdeer1.addstr(7, 8, "( )    /")
     lookdeer1.addstr(8, 9, "\\\\   /")
     lookdeer1.addstr(9, 11, "\\>/>")
-    
+
     lookdeer2.addstr(0, 16, "\\/     \\/")
     lookdeer2.addstr(1, 17, "\\Y/ \\Y/")
     lookdeer2.addstr(2, 19, "\\=/")
     lookdeer2.addstr(3, 17, "^\\o o/^")
     lookdeer2.addstr(4, 17, "//( )")
     lookdeer2.addstr(5, 7, "^~~~~~~~~// \\O/")
-    lookdeer2.addstr(6, 7, "(( )____( /")	# ))
+    lookdeer2.addstr(6, 7, "(( )____( /")       # ))
     lookdeer2.addstr(7, 7, "( /    |")
     lookdeer2.addstr(8, 8, "\\/    |")
     lookdeer2.addstr(9, 9, "|>   |>")
-    
+
     lookdeer3.addstr(0, 16, "\\/     \\/")
     lookdeer3.addstr(1, 17, "\\Y/ \\Y/")
     lookdeer3.addstr(2, 19, "\\=/")
     lookdeer3.addstr(3, 17, "^\\o o/^")
     lookdeer3.addstr(4, 17, "//( )")
     lookdeer3.addstr(5, 7, "^~~~~~~~~// \\O/")
-    lookdeer3.addstr(6, 6, "( ()_____( /")	# ))
+    lookdeer3.addstr(6, 6, "( ()_____( /")      # ))
     lookdeer3.addstr(7, 6, "/ /       /")
     lookdeer3.addstr(8, 5, "|/          \\")
     lookdeer3.addstr(9, 5, "/>           \\>")
-    
+
     lookdeer4.addstr(0, 16, "\\/     \\/")
     lookdeer4.addstr(1, 17, "\\Y/ \\Y/")
     lookdeer4.addstr(2, 19, "\\=/")
     lookdeer4.addstr(3, 17, "^\\o o/^")
     lookdeer4.addstr(4, 17, "//( )")
     lookdeer4.addstr(5, 7, "^~~~~~~~~// \\O/")
-    lookdeer4.addstr(6, 6, "( )______( /")	# )
-    lookdeer4.addstr(7, 5, "(/          \\")	# )
+    lookdeer4.addstr(6, 6, "( )______( /")      # )
+    lookdeer4.addstr(7, 5, "(/          \\")    # )
     lookdeer4.addstr(8, 0, "v___=             ----^")
 
     ###############################################
@@ -780,9 +780,9 @@
 
         # strng1
         treescrn4.addch(3, 13, ord(' '))
-        
+
         # strng2
-        
+
         # strng3
         treescrn4.addch(7, 15, ord(' '))
         treescrn4.addch(8, 11, ord(' '))
@@ -830,67 +830,67 @@
         treescrn.overlay(treescrn6)
 
         # balls
-	treescrn6.addch(6, 7, ord(' '))
-	treescrn6.addch(7, 18, ord(' '))
-	treescrn6.addch(10, 4, ord(' '))
-	treescrn6.addch(11, 23, ord(' '))
+        treescrn6.addch(6, 7, ord(' '))
+        treescrn6.addch(7, 18, ord(' '))
+        treescrn6.addch(10, 4, ord(' '))
+        treescrn6.addch(11, 23, ord(' '))
 
-	# star
-	treescrn6.standout()
-	treescrn6.addch(0, 12, ord('*'))
-	treescrn6.standend()
+        # star
+        treescrn6.standout()
+        treescrn6.addch(0, 12, ord('*'))
+        treescrn6.standend()
 
-	# strng1
+        # strng1
 
-	# strng2
-	treescrn6.addch(5, 11, ord(' '))
+        # strng2
+        treescrn6.addch(5, 11, ord(' '))
 
-	# strng3
-	treescrn6.addch(7, 13, ord(' '))
-	treescrn6.addch(8, 9, ord(' '))
+        # strng3
+        treescrn6.addch(7, 13, ord(' '))
+        treescrn6.addch(8, 9, ord(' '))
 
-	# strng4
-	treescrn6.addch(9, 14, ord(' '))
-	treescrn6.addch(10, 10, ord(' '))
-	treescrn6.addch(11, 6, ord(' '))
+        # strng4
+        treescrn6.addch(9, 14, ord(' '))
+        treescrn6.addch(10, 10, ord(' '))
+        treescrn6.addch(11, 6, ord(' '))
 
-	# strng5
-	treescrn6.addch(11, 16, ord(' '))
-	treescrn6.addch(12, 12, ord(' '))
+        # strng5
+        treescrn6.addch(11, 16, ord(' '))
+        treescrn6.addch(12, 12, ord(' '))
 
-	#  treescrn7
+        #  treescrn7
 
-	treescrn.overlay(treescrn7)
+        treescrn.overlay(treescrn7)
 
-	# balls
-	treescrn7.addch(3, 15, ord(' '))
-	treescrn7.addch(6, 7, ord(' '))
-	treescrn7.addch(7, 18, ord(' '))
-	treescrn7.addch(10, 4, ord(' '))
-	treescrn7.addch(11, 22, ord(' '))
+        # balls
+        treescrn7.addch(3, 15, ord(' '))
+        treescrn7.addch(6, 7, ord(' '))
+        treescrn7.addch(7, 18, ord(' '))
+        treescrn7.addch(10, 4, ord(' '))
+        treescrn7.addch(11, 22, ord(' '))
 
-	# star
-	treescrn7.addch(0, 12, ord('*'))
+        # star
+        treescrn7.addch(0, 12, ord('*'))
 
-	# strng1
-	treescrn7.addch(3, 12, ord(' '))
+        # strng1
+        treescrn7.addch(3, 12, ord(' '))
 
-	# strng2
-	treescrn7.addch(5, 13, ord(' '))
-	treescrn7.addch(6, 9, ord(' '))
+        # strng2
+        treescrn7.addch(5, 13, ord(' '))
+        treescrn7.addch(6, 9, ord(' '))
 
-	# strng3
-	treescrn7.addch(7, 15, ord(' '))
-	treescrn7.addch(8, 11, ord(' '))
+        # strng3
+        treescrn7.addch(7, 15, ord(' '))
+        treescrn7.addch(8, 11, ord(' '))
 
-	# strng4
-	treescrn7.addch(9, 16, ord(' '))
-	treescrn7.addch(10, 12, ord(' '))
-	treescrn7.addch(11, 8, ord(' '))
+        # strng4
+        treescrn7.addch(9, 16, ord(' '))
+        treescrn7.addch(10, 12, ord(' '))
+        treescrn7.addch(11, 8, ord(' '))
 
-	# strng5
-	treescrn7.addch(11, 18, ord(' '))
-	treescrn7.addch(12, 14, ord(' '))
+        # strng5
+        treescrn7.addch(11, 18, ord(' '))
+        treescrn7.addch(12, 14, ord(' '))
 
         look_out(150)
         reindeer()
@@ -902,5 +902,5 @@
         look_out(500)
         for i in range(0, 20):
             blinkit()
-    
+
 curses.wrapper(main)
diff --git a/Demo/md5test/md5driver.py b/Demo/md5test/md5driver.py
index bbd6130..4c7cfcb 100755
--- a/Demo/md5test/md5driver.py
+++ b/Demo/md5test/md5driver.py
@@ -6,8 +6,8 @@
     outstr = ''
     for i in str:
         o = ord(i)
-        outstr = (outstr 
-                  + string.hexdigits[(o >> 4) & 0xF] 
+        outstr = (outstr
+                  + string.hexdigits[(o >> 4) & 0xF]
                   + string.hexdigits[o & 0xF])
     print outstr,
 
@@ -97,8 +97,8 @@
     MDString('abc')
     MDString('message digest')
     MDString(makestr(ord('a'), ord('z')))
-    MDString(makestr(ord('A'), ord('Z')) 
-              + makestr(ord('a'), ord('z')) 
+    MDString(makestr(ord('A'), ord('Z'))
+              + makestr(ord('a'), ord('z'))
               + makestr(ord('0'), ord('9')))
     MDString((makestr(ord('1'), ord('9')) + '0') * 8)
 
diff --git a/Demo/metaclasses/Eiffel.py b/Demo/metaclasses/Eiffel.py
index 68eb1cd..24fac14 100644
--- a/Demo/metaclasses/Eiffel.py
+++ b/Demo/metaclasses/Eiffel.py
@@ -87,7 +87,7 @@
         if self.post:
             apply(self.post, (Result,) + args, kw)
         return Result
-    
+
 class EiffelHelper(MetaHelper):
     __methodwrapper__ = EiffelMethodWrapper
 
diff --git a/Demo/metaclasses/Meta.py b/Demo/metaclasses/Meta.py
index 5534074..580f582 100644
--- a/Demo/metaclasses/Meta.py
+++ b/Demo/metaclasses/Meta.py
@@ -88,7 +88,7 @@
             init = lambda: None
         apply(init, args, kw)
         return inst
-    
+
 
 Meta = MetaClass('Meta', (), {})
 
@@ -116,5 +116,3 @@
 
 if __name__ == '__main__':
     _test()
-
-    
diff --git a/Demo/metaclasses/Synch.py b/Demo/metaclasses/Synch.py
index df70337..80e52d9 100644
--- a/Demo/metaclasses/Synch.py
+++ b/Demo/metaclasses/Synch.py
@@ -125,7 +125,7 @@
     lock.release()
 
     lock.acquire()
-    
+
     thread.start_new_thread(f1, (lock,)) # Adds 2
     thread.start_new_thread(f1, (lock, f1)) # Adds 3
     thread.start_new_thread(f2, (lock,)) # Adds 1
diff --git a/Demo/metaclasses/Trace.py b/Demo/metaclasses/Trace.py
index ea12cd9..69b9fab 100644
--- a/Demo/metaclasses/Trace.py
+++ b/Demo/metaclasses/Trace.py
@@ -142,4 +142,3 @@
 
 if __name__ == '__main__':
     _test()
-
diff --git a/Demo/newmetaclasses/Eiffel.py b/Demo/newmetaclasses/Eiffel.py
index 1dd7e6c..78a8bb5 100644
--- a/Demo/newmetaclasses/Eiffel.py
+++ b/Demo/newmetaclasses/Eiffel.py
@@ -48,7 +48,7 @@
             method.__doc__ = func.__doc__
 
         return method
-    
+
     make_eiffel_method = staticmethod(make_eiffel_method)
 
 class EiffelMethodWrapper:
@@ -66,7 +66,7 @@
         self._func = func
         self._pre = pre
         self._post = post
-        
+
         self.__name__ = func.__name__
         self.__doc__ = func.__doc__
 
@@ -141,4 +141,3 @@
 if __name__ == "__main__":
     _test(EiffelMetaClass1)
     _test(EiffelMetaClass2)
-
diff --git a/Demo/newmetaclasses/Enum.py b/Demo/newmetaclasses/Enum.py
index 5d490a9..2a5823b 100644
--- a/Demo/newmetaclasses/Enum.py
+++ b/Demo/newmetaclasses/Enum.py
@@ -175,4 +175,3 @@
 if __name__ == '__main__':
     _test()
     _test2()
-
diff --git a/Demo/pdist/FSProxy.py b/Demo/pdist/FSProxy.py
index 7510d1e..a1ab635 100755
--- a/Demo/pdist/FSProxy.py
+++ b/Demo/pdist/FSProxy.py
@@ -24,299 +24,299 @@
 import fnmatch
 
 if os.name == 'mac':
-	import macfs
-	maxnamelen = 31
+    import macfs
+    maxnamelen = 31
 else:
-	macfs = None
-	maxnamelen = 255
+    macfs = None
+    maxnamelen = 255
 
 skipnames = (os.curdir, os.pardir)
 
 
 class FSProxyLocal:
-	
-	def __init__(self):
-		self._dirstack = []
-		self._ignore = ['*.pyc'] + self._readignore()
-	
-	def _close(self):
-		while self._dirstack:
-			self.back()
-	
-	def _readignore(self):
-		file = self._hide('ignore')
-		try:
-			f = open(file)
-		except IOError:
-			file = self._hide('synctree.ignorefiles')
-			try:
-				f = open(file)
-			except IOError:
-				return []
-		ignore = []
-		while 1:
-			line = f.readline()
-			if not line: break
-			if line[-1] == '\n': line = line[:-1]
-			ignore.append(line)
-		f.close()
-		return ignore
-	
-	def _hidden(self, name):
-		if os.name == 'mac':
-			return name[0] == '(' and name[-1] == ')'
-		else:
-			return name[0] == '.'
-	
-	def _hide(self, name):
-		if os.name == 'mac':
-			return '(%s)' % name
-		else:
-			return '.%s' % name
-	
-	def visible(self, name):
-		if len(name) > maxnamelen: return 0
-		if name[-1] == '~': return 0
-		if name in skipnames: return 0
-		if self._hidden(name): return 0
-		head, tail = os.path.split(name)
-		if head or not tail: return 0
-		if macfs:
-			if os.path.exists(name) and not os.path.isdir(name):
-				try:
-					fs = macfs.FSSpec(name)
-					c, t = fs.GetCreatorType()
-					if t != 'TEXT': return 0
-				except macfs.error, msg:
-					print "***", name, msg
-					return 0
-		else:
-			if os.path.islink(name): return 0
-			if '\0' in open(name, 'rb').read(512): return 0
-		for ign in self._ignore:
-			if fnmatch.fnmatch(name, ign): return 0
-		return 1
-	
-	def check(self, name):
-		if not self.visible(name):
-			raise os.error, "protected name %s" % repr(name)
-	
-	def checkfile(self, name):
-		self.check(name)
-		if not os.path.isfile(name):
-			raise os.error, "not a plain file %s" % repr(name)
-	
-	def pwd(self):
-		return os.getcwd()
-	
-	def cd(self, name):
-		self.check(name)
-		save = os.getcwd(), self._ignore
-		os.chdir(name)
-		self._dirstack.append(save)
-		self._ignore = self._ignore + self._readignore()
-	
-	def back(self):
-		if not self._dirstack:
-			raise os.error, "empty directory stack"
-		dir, ignore = self._dirstack[-1]
-		os.chdir(dir)
-		del self._dirstack[-1]
-		self._ignore = ignore
-	
-	def _filter(self, files, pat = None):
-		if pat:
-			def keep(name, pat = pat):
-				return fnmatch.fnmatch(name, pat)
-			files = filter(keep, files)
-		files = filter(self.visible, files)
-		files.sort()
-		return files
-	
-	def list(self, pat = None):
-		files = os.listdir(os.curdir)
-		return self._filter(files, pat)
-	
-	def listfiles(self, pat = None):
-		files = os.listdir(os.curdir)
-		files = filter(os.path.isfile, files)
-		return self._filter(files, pat)
-	
-	def listsubdirs(self, pat = None):
-		files = os.listdir(os.curdir)
-		files = filter(os.path.isdir, files)
-		return self._filter(files, pat)
-	
-	def exists(self, name):
-		return self.visible(name) and os.path.exists(name)
-	
-	def isdir(self, name):
-		return self.visible(name) and os.path.isdir(name)
-	
-	def islink(self, name):
-		return self.visible(name) and os.path.islink(name)
-	
-	def isfile(self, name):
-		return self.visible(name) and os.path.isfile(name)
-	
-	def sum(self, name):
-		self.checkfile(name)
-		BUFFERSIZE = 1024*8
-		f = open(name)
-		sum = md5.new()
-		while 1:
-			buffer = f.read(BUFFERSIZE)
-			if not buffer:
-				break
-			sum.update(buffer)
-		return sum.digest()
-	
-	def size(self, name):
-		self.checkfile(name)
-		return os.stat(name)[ST_SIZE]
-	
-	def mtime(self, name):
-		self.checkfile(name)
-		return time.localtime(os.stat(name)[ST_MTIME])
-	
-	def stat(self, name):
-		self.checkfile(name)
-		size = os.stat(name)[ST_SIZE]
-		mtime = time.localtime(os.stat(name)[ST_MTIME])
-		return size, mtime
-	
-	def info(self, name):
-		sum = self.sum(name)
-		size = os.stat(name)[ST_SIZE]
-		mtime = time.localtime(os.stat(name)[ST_MTIME])
-		return sum, size, mtime
-	
-	def _list(self, function, list):
-		if list is None:
-			list = self.listfiles()
-		res = []
-		for name in list:
-			try:
-				res.append((name, function(name)))
-			except (os.error, IOError):
-				res.append((name, None))
-		return res
-	
-	def sumlist(self, list = None):
-		return self._list(self.sum, list)
-	
-	def statlist(self, list = None):
-		return self._list(self.stat, list)
-	
-	def mtimelist(self, list = None):
-		return self._list(self.mtime, list)
-	
-	def sizelist(self, list = None):
-		return self._list(self.size, list)
-	
-	def infolist(self, list = None):
-		return self._list(self.info, list)
-	
-	def _dict(self, function, list):
-		if list is None:
-			list = self.listfiles()
-		dict = {}
-		for name in list:
-			try:
-				dict[name] = function(name)
-			except (os.error, IOError):
-				pass
-		return dict
-	
-	def sumdict(self, list = None):
-		return self.dict(self.sum, list)
-	
-	def sizedict(self, list = None):
-		return self.dict(self.size, list)
-	
-	def mtimedict(self, list = None):
-		return self.dict(self.mtime, list)
-	
-	def statdict(self, list = None):
-		return self.dict(self.stat, list)
-	
-	def infodict(self, list = None):
-		return self._dict(self.info, list)
-	
-	def read(self, name, offset = 0, length = -1):
-		self.checkfile(name)
-		f = open(name)
-		f.seek(offset)
-		if length == 0:
-			data = ''
-		elif length < 0:
-			data = f.read()
-		else:
-			data = f.read(length)
-		f.close()
-		return data
-	
-	def create(self, name):
-		self.check(name)
-		if os.path.exists(name):
-			self.checkfile(name)
-			bname = name + '~'
-			try:
-				os.unlink(bname)
-			except os.error:
-				pass
-			os.rename(name, bname)
-		f = open(name, 'w')
-		f.close()
-	
-	def write(self, name, data, offset = 0):
-		self.checkfile(name)
-		f = open(name, 'r+')
-		f.seek(offset)
-		f.write(data)
-		f.close()
-	
-	def mkdir(self, name):
-		self.check(name)
-		os.mkdir(name, 0777)
-	
-	def rmdir(self, name):
-		self.check(name)
-		os.rmdir(name)
+
+    def __init__(self):
+        self._dirstack = []
+        self._ignore = ['*.pyc'] + self._readignore()
+
+    def _close(self):
+        while self._dirstack:
+            self.back()
+
+    def _readignore(self):
+        file = self._hide('ignore')
+        try:
+            f = open(file)
+        except IOError:
+            file = self._hide('synctree.ignorefiles')
+            try:
+                f = open(file)
+            except IOError:
+                return []
+        ignore = []
+        while 1:
+            line = f.readline()
+            if not line: break
+            if line[-1] == '\n': line = line[:-1]
+            ignore.append(line)
+        f.close()
+        return ignore
+
+    def _hidden(self, name):
+        if os.name == 'mac':
+            return name[0] == '(' and name[-1] == ')'
+        else:
+            return name[0] == '.'
+
+    def _hide(self, name):
+        if os.name == 'mac':
+            return '(%s)' % name
+        else:
+            return '.%s' % name
+
+    def visible(self, name):
+        if len(name) > maxnamelen: return 0
+        if name[-1] == '~': return 0
+        if name in skipnames: return 0
+        if self._hidden(name): return 0
+        head, tail = os.path.split(name)
+        if head or not tail: return 0
+        if macfs:
+            if os.path.exists(name) and not os.path.isdir(name):
+                try:
+                    fs = macfs.FSSpec(name)
+                    c, t = fs.GetCreatorType()
+                    if t != 'TEXT': return 0
+                except macfs.error, msg:
+                    print "***", name, msg
+                    return 0
+        else:
+            if os.path.islink(name): return 0
+            if '\0' in open(name, 'rb').read(512): return 0
+        for ign in self._ignore:
+            if fnmatch.fnmatch(name, ign): return 0
+        return 1
+
+    def check(self, name):
+        if not self.visible(name):
+            raise os.error, "protected name %s" % repr(name)
+
+    def checkfile(self, name):
+        self.check(name)
+        if not os.path.isfile(name):
+            raise os.error, "not a plain file %s" % repr(name)
+
+    def pwd(self):
+        return os.getcwd()
+
+    def cd(self, name):
+        self.check(name)
+        save = os.getcwd(), self._ignore
+        os.chdir(name)
+        self._dirstack.append(save)
+        self._ignore = self._ignore + self._readignore()
+
+    def back(self):
+        if not self._dirstack:
+            raise os.error, "empty directory stack"
+        dir, ignore = self._dirstack[-1]
+        os.chdir(dir)
+        del self._dirstack[-1]
+        self._ignore = ignore
+
+    def _filter(self, files, pat = None):
+        if pat:
+            def keep(name, pat = pat):
+                return fnmatch.fnmatch(name, pat)
+            files = filter(keep, files)
+        files = filter(self.visible, files)
+        files.sort()
+        return files
+
+    def list(self, pat = None):
+        files = os.listdir(os.curdir)
+        return self._filter(files, pat)
+
+    def listfiles(self, pat = None):
+        files = os.listdir(os.curdir)
+        files = filter(os.path.isfile, files)
+        return self._filter(files, pat)
+
+    def listsubdirs(self, pat = None):
+        files = os.listdir(os.curdir)
+        files = filter(os.path.isdir, files)
+        return self._filter(files, pat)
+
+    def exists(self, name):
+        return self.visible(name) and os.path.exists(name)
+
+    def isdir(self, name):
+        return self.visible(name) and os.path.isdir(name)
+
+    def islink(self, name):
+        return self.visible(name) and os.path.islink(name)
+
+    def isfile(self, name):
+        return self.visible(name) and os.path.isfile(name)
+
+    def sum(self, name):
+        self.checkfile(name)
+        BUFFERSIZE = 1024*8
+        f = open(name)
+        sum = md5.new()
+        while 1:
+            buffer = f.read(BUFFERSIZE)
+            if not buffer:
+                break
+            sum.update(buffer)
+        return sum.digest()
+
+    def size(self, name):
+        self.checkfile(name)
+        return os.stat(name)[ST_SIZE]
+
+    def mtime(self, name):
+        self.checkfile(name)
+        return time.localtime(os.stat(name)[ST_MTIME])
+
+    def stat(self, name):
+        self.checkfile(name)
+        size = os.stat(name)[ST_SIZE]
+        mtime = time.localtime(os.stat(name)[ST_MTIME])
+        return size, mtime
+
+    def info(self, name):
+        sum = self.sum(name)
+        size = os.stat(name)[ST_SIZE]
+        mtime = time.localtime(os.stat(name)[ST_MTIME])
+        return sum, size, mtime
+
+    def _list(self, function, list):
+        if list is None:
+            list = self.listfiles()
+        res = []
+        for name in list:
+            try:
+                res.append((name, function(name)))
+            except (os.error, IOError):
+                res.append((name, None))
+        return res
+
+    def sumlist(self, list = None):
+        return self._list(self.sum, list)
+
+    def statlist(self, list = None):
+        return self._list(self.stat, list)
+
+    def mtimelist(self, list = None):
+        return self._list(self.mtime, list)
+
+    def sizelist(self, list = None):
+        return self._list(self.size, list)
+
+    def infolist(self, list = None):
+        return self._list(self.info, list)
+
+    def _dict(self, function, list):
+        if list is None:
+            list = self.listfiles()
+        dict = {}
+        for name in list:
+            try:
+                dict[name] = function(name)
+            except (os.error, IOError):
+                pass
+        return dict
+
+    def sumdict(self, list = None):
+        return self.dict(self.sum, list)
+
+    def sizedict(self, list = None):
+        return self.dict(self.size, list)
+
+    def mtimedict(self, list = None):
+        return self.dict(self.mtime, list)
+
+    def statdict(self, list = None):
+        return self.dict(self.stat, list)
+
+    def infodict(self, list = None):
+        return self._dict(self.info, list)
+
+    def read(self, name, offset = 0, length = -1):
+        self.checkfile(name)
+        f = open(name)
+        f.seek(offset)
+        if length == 0:
+            data = ''
+        elif length < 0:
+            data = f.read()
+        else:
+            data = f.read(length)
+        f.close()
+        return data
+
+    def create(self, name):
+        self.check(name)
+        if os.path.exists(name):
+            self.checkfile(name)
+            bname = name + '~'
+            try:
+                os.unlink(bname)
+            except os.error:
+                pass
+            os.rename(name, bname)
+        f = open(name, 'w')
+        f.close()
+
+    def write(self, name, data, offset = 0):
+        self.checkfile(name)
+        f = open(name, 'r+')
+        f.seek(offset)
+        f.write(data)
+        f.close()
+
+    def mkdir(self, name):
+        self.check(name)
+        os.mkdir(name, 0777)
+
+    def rmdir(self, name):
+        self.check(name)
+        os.rmdir(name)
 
 
 class FSProxyServer(FSProxyLocal, server.Server):
-	
-	def __init__(self, address, verbose = server.VERBOSE):
-		FSProxyLocal.__init__(self)
-		server.Server.__init__(self, address, verbose)
-	
-	def _close(self):
-		server.Server._close(self)
-		FSProxyLocal._close(self)
-	
-	def _serve(self):
-		server.Server._serve(self)
-		# Retreat into start directory
-		while self._dirstack: self.back()
+
+    def __init__(self, address, verbose = server.VERBOSE):
+        FSProxyLocal.__init__(self)
+        server.Server.__init__(self, address, verbose)
+
+    def _close(self):
+        server.Server._close(self)
+        FSProxyLocal._close(self)
+
+    def _serve(self):
+        server.Server._serve(self)
+        # Retreat into start directory
+        while self._dirstack: self.back()
 
 
 class FSProxyClient(client.Client):
-	
-	def __init__(self, address, verbose = client.VERBOSE):
-		client.Client.__init__(self, address, verbose)
+
+    def __init__(self, address, verbose = client.VERBOSE):
+        client.Client.__init__(self, address, verbose)
 
 
 def test():
-	import string
-	import sys
-	if sys.argv[1:]:
-		port = string.atoi(sys.argv[1])
-	else:
-		port = 4127
-	proxy = FSProxyServer(('', port))
-	proxy._serverloop()
+    import string
+    import sys
+    if sys.argv[1:]:
+        port = string.atoi(sys.argv[1])
+    else:
+        port = 4127
+    proxy = FSProxyServer(('', port))
+    proxy._serverloop()
 
 
 if __name__ == '__main__':
-	test()
+    test()
diff --git a/Demo/pdist/client.py b/Demo/pdist/client.py
index a00f005..3e97d84 100755
--- a/Demo/pdist/client.py
+++ b/Demo/pdist/client.py
@@ -12,118 +12,118 @@
 
 
 class Client:
-	
-	"""RPC Client class.  No need to derive a class -- it's fully generic."""
-	
-	def __init__(self, address, verbose = VERBOSE):
-		self._pre_init(address, verbose)
-		self._post_init()
-	
-	def _pre_init(self, address, verbose = VERBOSE):
-		if type(address) == type(0):
-			address = ('', address)
-		self._address = address
-		self._verbose = verbose
-		if self._verbose: print "Connecting to %s ..." % repr(address)
-		self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-		self._socket.connect(address)
-		if self._verbose: print "Connected."
-		self._lastid = 0 # Last id for which a reply has been received
-		self._nextid = 1 # Id of next request
-		self._replies = {} # Unprocessed replies
-		self._rf = self._socket.makefile('r')
-		self._wf = self._socket.makefile('w')
-	
-	def _post_init(self):
-		self._methods = self._call('.methods')
-	
-	def __del__(self):
-		self._close()
-	
-	def _close(self):
-		if self._rf: self._rf.close()
-		self._rf = None
-		if self._wf: self._wf.close()
-		self._wf = None
-		if self._socket: self._socket.close()
-		self._socket = None
-	
-	def __getattr__(self, name):
-		if name in self._methods:
-			method = _stub(self, name)
-			setattr(self, name, method) # XXX circular reference
-			return method
-		raise AttributeError, name
-	
-	def _setverbose(self, verbose):
-		self._verbose = verbose
-	
-	def _call(self, name, *args):
-		return self._vcall(name, args)
-	
-	def _vcall(self, name, args):
-		return self._recv(self._vsend(name, args))
-	
-	def _send(self, name, *args):
-		return self._vsend(name, args)
-	
-	def _send_noreply(self, name, *args):
-		return self._vsend(name, args, 0)
-	
-	def _vsend_noreply(self, name, args):
-		return self._vsend(name, args, 0)
-	
-	def _vsend(self, name, args, wantreply = 1):
-		id = self._nextid
-		self._nextid = id+1
-		if not wantreply: id = -id
-		request = (name, args, id)
-		if self._verbose > 1: print "sending request: %s" % repr(request)
-		wp = pickle.Pickler(self._wf)
-		wp.dump(request)
-		return id
-	
-	def _recv(self, id):
-		exception, value, rid = self._vrecv(id)
-		if rid != id:
-			raise RuntimeError, "request/reply id mismatch: %d/%d" % (id, rid)
-		if exception is None:
-			return value
-		x = exception
-		if hasattr(__builtin__, exception):
-			x = getattr(__builtin__, exception)
-		elif exception in ('posix.error', 'mac.error'):
-			x = os.error
-		if x == exception:
-			exception = x
-		raise exception, value		
-	
-	def _vrecv(self, id):
-		self._flush()
-		if self._replies.has_key(id):
-			if self._verbose > 1: print "retrieving previous reply, id = %d" % id
-			reply = self._replies[id]
-			del self._replies[id]
-			return reply
-		aid = abs(id)
-		while 1:
-			if self._verbose > 1: print "waiting for reply, id = %d" % id
-			rp = pickle.Unpickler(self._rf)
-			reply = rp.load()
-			del rp
-			if self._verbose > 1: print "got reply: %s" % repr(reply)
-			rid = reply[2]
-			arid = abs(rid)
-			if arid == aid:
-				if self._verbose > 1: print "got it"
-				return reply
-			self._replies[rid] = reply
-			if arid > aid:
-				if self._verbose > 1: print "got higher id, assume all ok"
-				return (None, None, id)
-	
-	def _flush(self):
-		self._wf.flush()
+
+    """RPC Client class.  No need to derive a class -- it's fully generic."""
+
+    def __init__(self, address, verbose = VERBOSE):
+        self._pre_init(address, verbose)
+        self._post_init()
+
+    def _pre_init(self, address, verbose = VERBOSE):
+        if type(address) == type(0):
+            address = ('', address)
+        self._address = address
+        self._verbose = verbose
+        if self._verbose: print "Connecting to %s ..." % repr(address)
+        self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self._socket.connect(address)
+        if self._verbose: print "Connected."
+        self._lastid = 0 # Last id for which a reply has been received
+        self._nextid = 1 # Id of next request
+        self._replies = {} # Unprocessed replies
+        self._rf = self._socket.makefile('r')
+        self._wf = self._socket.makefile('w')
+
+    def _post_init(self):
+        self._methods = self._call('.methods')
+
+    def __del__(self):
+        self._close()
+
+    def _close(self):
+        if self._rf: self._rf.close()
+        self._rf = None
+        if self._wf: self._wf.close()
+        self._wf = None
+        if self._socket: self._socket.close()
+        self._socket = None
+
+    def __getattr__(self, name):
+        if name in self._methods:
+            method = _stub(self, name)
+            setattr(self, name, method) # XXX circular reference
+            return method
+        raise AttributeError, name
+
+    def _setverbose(self, verbose):
+        self._verbose = verbose
+
+    def _call(self, name, *args):
+        return self._vcall(name, args)
+
+    def _vcall(self, name, args):
+        return self._recv(self._vsend(name, args))
+
+    def _send(self, name, *args):
+        return self._vsend(name, args)
+
+    def _send_noreply(self, name, *args):
+        return self._vsend(name, args, 0)
+
+    def _vsend_noreply(self, name, args):
+        return self._vsend(name, args, 0)
+
+    def _vsend(self, name, args, wantreply = 1):
+        id = self._nextid
+        self._nextid = id+1
+        if not wantreply: id = -id
+        request = (name, args, id)
+        if self._verbose > 1: print "sending request: %s" % repr(request)
+        wp = pickle.Pickler(self._wf)
+        wp.dump(request)
+        return id
+
+    def _recv(self, id):
+        exception, value, rid = self._vrecv(id)
+        if rid != id:
+            raise RuntimeError, "request/reply id mismatch: %d/%d" % (id, rid)
+        if exception is None:
+            return value
+        x = exception
+        if hasattr(__builtin__, exception):
+            x = getattr(__builtin__, exception)
+        elif exception in ('posix.error', 'mac.error'):
+            x = os.error
+        if x == exception:
+            exception = x
+        raise exception, value
+
+    def _vrecv(self, id):
+        self._flush()
+        if self._replies.has_key(id):
+            if self._verbose > 1: print "retrieving previous reply, id = %d" % id
+            reply = self._replies[id]
+            del self._replies[id]
+            return reply
+        aid = abs(id)
+        while 1:
+            if self._verbose > 1: print "waiting for reply, id = %d" % id
+            rp = pickle.Unpickler(self._rf)
+            reply = rp.load()
+            del rp
+            if self._verbose > 1: print "got reply: %s" % repr(reply)
+            rid = reply[2]
+            arid = abs(rid)
+            if arid == aid:
+                if self._verbose > 1: print "got it"
+                return reply
+            self._replies[rid] = reply
+            if arid > aid:
+                if self._verbose > 1: print "got higher id, assume all ok"
+                return (None, None, id)
+
+    def _flush(self):
+        self._wf.flush()
 
 
 from security import Security
@@ -131,28 +131,27 @@
 
 class SecureClient(Client, Security):
 
-	def __init__(self, *args):
-		import string
-		apply(self._pre_init, args)
-		Security.__init__(self)
-		self._wf.flush()
-		line = self._rf.readline()
-		challenge = string.atoi(string.strip(line))
-		response = self._encode_challenge(challenge)
-		line = repr(long(response))
-		if line[-1] in 'Ll': line = line[:-1]
-		self._wf.write(line + '\n')
-		self._wf.flush()
-		self._post_init()
+    def __init__(self, *args):
+        import string
+        apply(self._pre_init, args)
+        Security.__init__(self)
+        self._wf.flush()
+        line = self._rf.readline()
+        challenge = string.atoi(string.strip(line))
+        response = self._encode_challenge(challenge)
+        line = repr(long(response))
+        if line[-1] in 'Ll': line = line[:-1]
+        self._wf.write(line + '\n')
+        self._wf.flush()
+        self._post_init()
 
 class _stub:
-	
-	"""Helper class for Client -- each instance serves as a method of the client."""
-	
-	def __init__(self, client, name):
-		self._client = client
-		self._name = name
-	
-	def __call__(self, *args):
-		return self._client._vcall(self._name, args)
 
+    """Helper class for Client -- each instance serves as a method of the client."""
+
+    def __init__(self, client, name):
+        self._client = client
+        self._name = name
+
+    def __call__(self, *args):
+        return self._client._vcall(self._name, args)
diff --git a/Demo/pdist/cmdfw.py b/Demo/pdist/cmdfw.py
index 25584b7..e2edd0a 100755
--- a/Demo/pdist/cmdfw.py
+++ b/Demo/pdist/cmdfw.py
@@ -3,142 +3,142 @@
 
 class CommandFrameWork:
 
-	"""Framework class for command line interfaces like CVS.
+    """Framework class for command line interfaces like CVS.
 
-	The general command line structure is
+    The general command line structure is
 
-		command [flags] subcommand [subflags] [argument] ...
+            command [flags] subcommand [subflags] [argument] ...
 
-	There's a class variable GlobalFlags which specifies the
-	global flags options.  Subcommands are defined by defining
-	methods named do_<subcommand>.  Flags for the subcommand are
-	defined by defining class or instance variables named
-	flags_<subcommand>.  If there's no command, method default()
-	is called.  The __doc__ strings for the do_ methods are used
-	for the usage message, printed after the general usage message
-	which is the class variable UsageMessage.  The class variable
-	PostUsageMessage is printed after all the do_ methods' __doc__
-	strings.  The method's return value can be a suggested exit
-	status.  [XXX Need to rewrite this to clarify it.]
+    There's a class variable GlobalFlags which specifies the
+    global flags options.  Subcommands are defined by defining
+    methods named do_<subcommand>.  Flags for the subcommand are
+    defined by defining class or instance variables named
+    flags_<subcommand>.  If there's no command, method default()
+    is called.  The __doc__ strings for the do_ methods are used
+    for the usage message, printed after the general usage message
+    which is the class variable UsageMessage.  The class variable
+    PostUsageMessage is printed after all the do_ methods' __doc__
+    strings.  The method's return value can be a suggested exit
+    status.  [XXX Need to rewrite this to clarify it.]
 
-	Common usage is to derive a class, instantiate it, and then call its
-	run() method; by default this takes its arguments from sys.argv[1:].
-	"""
+    Common usage is to derive a class, instantiate it, and then call its
+    run() method; by default this takes its arguments from sys.argv[1:].
+    """
 
-	UsageMessage = \
-	  "usage: (name)s [flags] subcommand [subflags] [argument] ..."
+    UsageMessage = \
+      "usage: (name)s [flags] subcommand [subflags] [argument] ..."
 
-	PostUsageMessage = None
+    PostUsageMessage = None
 
-	GlobalFlags = ''
+    GlobalFlags = ''
 
-	def __init__(self):
-		"""Constructor, present for completeness."""
-		pass
+    def __init__(self):
+        """Constructor, present for completeness."""
+        pass
 
-	def run(self, args = None):
-		"""Process flags, subcommand and options, then run it."""
-		import getopt, sys
-		if args is None: args = sys.argv[1:]
-		try:
-			opts, args = getopt.getopt(args, self.GlobalFlags)
-		except getopt.error, msg:
-			return self.usage(msg)
-		self.options(opts)
-		if not args:
-			self.ready()
-			return self.default()
-		else:
-			cmd = args[0]
-			mname = 'do_' + cmd
-			fname = 'flags_' + cmd
-			try:
-				method = getattr(self, mname)
-			except AttributeError:
-				return self.usage("command %r unknown" % (cmd,))
-			try:
-				flags = getattr(self, fname)
-			except AttributeError:
-				flags = ''
-			try:
-				opts, args = getopt.getopt(args[1:], flags)
-			except getopt.error, msg:
-				return self.usage(
-					"subcommand %s: " % cmd + str(msg))
-			self.ready()
-			return method(opts, args)
+    def run(self, args = None):
+        """Process flags, subcommand and options, then run it."""
+        import getopt, sys
+        if args is None: args = sys.argv[1:]
+        try:
+            opts, args = getopt.getopt(args, self.GlobalFlags)
+        except getopt.error, msg:
+            return self.usage(msg)
+        self.options(opts)
+        if not args:
+            self.ready()
+            return self.default()
+        else:
+            cmd = args[0]
+            mname = 'do_' + cmd
+            fname = 'flags_' + cmd
+            try:
+                method = getattr(self, mname)
+            except AttributeError:
+                return self.usage("command %r unknown" % (cmd,))
+            try:
+                flags = getattr(self, fname)
+            except AttributeError:
+                flags = ''
+            try:
+                opts, args = getopt.getopt(args[1:], flags)
+            except getopt.error, msg:
+                return self.usage(
+                        "subcommand %s: " % cmd + str(msg))
+            self.ready()
+            return method(opts, args)
 
-	def options(self, opts):
-		"""Process the options retrieved by getopt.
-		Override this if you have any options."""
-		if opts:
-			print "-"*40
-			print "Options:"
-			for o, a in opts:
-				print 'option', o, 'value', repr(a)
-			print "-"*40
+    def options(self, opts):
+        """Process the options retrieved by getopt.
+        Override this if you have any options."""
+        if opts:
+            print "-"*40
+            print "Options:"
+            for o, a in opts:
+                print 'option', o, 'value', repr(a)
+            print "-"*40
 
-	def ready(self):
-		"""Called just before calling the subcommand."""
-		pass
+    def ready(self):
+        """Called just before calling the subcommand."""
+        pass
 
-	def usage(self, msg = None):
-		"""Print usage message.  Return suitable exit code (2)."""
-		if msg: print msg
-		print self.UsageMessage % {'name': self.__class__.__name__}
-		docstrings = {}
-		c = self.__class__
-		while 1:
-			for name in dir(c):
-				if name[:3] == 'do_':
-					if docstrings.has_key(name):
-						continue
-					try:
-						doc = getattr(c, name).__doc__
-					except:
-						doc = None
-					if doc:
-						docstrings[name] = doc
-			if not c.__bases__:
-				break
-			c = c.__bases__[0]
-		if docstrings:
-			print "where subcommand can be:"
-			names = docstrings.keys()
-			names.sort()
-			for name in names:
-				print docstrings[name]
-		if self.PostUsageMessage:
-			print self.PostUsageMessage
-		return 2
+    def usage(self, msg = None):
+        """Print usage message.  Return suitable exit code (2)."""
+        if msg: print msg
+        print self.UsageMessage % {'name': self.__class__.__name__}
+        docstrings = {}
+        c = self.__class__
+        while 1:
+            for name in dir(c):
+                if name[:3] == 'do_':
+                    if docstrings.has_key(name):
+                        continue
+                    try:
+                        doc = getattr(c, name).__doc__
+                    except:
+                        doc = None
+                    if doc:
+                        docstrings[name] = doc
+            if not c.__bases__:
+                break
+            c = c.__bases__[0]
+        if docstrings:
+            print "where subcommand can be:"
+            names = docstrings.keys()
+            names.sort()
+            for name in names:
+                print docstrings[name]
+        if self.PostUsageMessage:
+            print self.PostUsageMessage
+        return 2
 
-	def default(self):
-		"""Default method, called when no subcommand is given.
-		You should always override this."""
-		print "Nobody expects the Spanish Inquisition!"
+    def default(self):
+        """Default method, called when no subcommand is given.
+        You should always override this."""
+        print "Nobody expects the Spanish Inquisition!"
 
 
 def test():
-	"""Test script -- called when this module is run as a script."""
-	import sys
-	class Hello(CommandFrameWork):
-		def do_hello(self, opts, args):
-			"hello -- print 'hello world', needs no arguments"
-			print "Hello, world"
-	x = Hello()
-	tests = [
-		[],
-		['hello'],
-		['spam'],
-		['-x'],
-		['hello', '-x'],
-		None,
-		]
-	for t in tests:
-		print '-'*10, t, '-'*10
-		sts = x.run(t)
-		print "Exit status:", repr(sts)
+    """Test script -- called when this module is run as a script."""
+    import sys
+    class Hello(CommandFrameWork):
+        def do_hello(self, opts, args):
+            "hello -- print 'hello world', needs no arguments"
+            print "Hello, world"
+    x = Hello()
+    tests = [
+            [],
+            ['hello'],
+            ['spam'],
+            ['-x'],
+            ['hello', '-x'],
+            None,
+            ]
+    for t in tests:
+        print '-'*10, t, '-'*10
+        sts = x.run(t)
+        print "Exit status:", repr(sts)
 
 
 if __name__ == '__main__':
-	test()
+    test()
diff --git a/Demo/pdist/cmptree.py b/Demo/pdist/cmptree.py
index 8a34f3f..f6c611f 100755
--- a/Demo/pdist/cmptree.py
+++ b/Demo/pdist/cmptree.py
@@ -7,202 +7,202 @@
 import os
 
 def main():
-	pwd = os.getcwd()
-	s = raw_input("chdir [%s] " % pwd)
-	if s:
-		os.chdir(s)
-		pwd = os.getcwd()
-	host = ask("host", 'voorn.cwi.nl')
-	port = 4127
-	verbose = 1
-	mode = ''
-	print """\
+    pwd = os.getcwd()
+    s = raw_input("chdir [%s] " % pwd)
+    if s:
+        os.chdir(s)
+        pwd = os.getcwd()
+    host = ask("host", 'voorn.cwi.nl')
+    port = 4127
+    verbose = 1
+    mode = ''
+    print """\
 Mode should be a string of characters, indicating what to do with differences.
 r - read different files to local file system
 w - write different files to remote file system
 c - create new files, either remote or local
 d - delete disappearing files, either remote or local
 """
-	s = raw_input("mode [%s] " % mode)
-	if s: mode = s
-	address = (host, port)
-	t1 = time.time()
-	local = FSProxy.FSProxyLocal()
-	remote = FSProxy.FSProxyClient(address, verbose)
-	compare(local, remote, mode)
-	remote._close()
-	local._close()
-	t2 = time.time()
-	dt = t2-t1
-	mins, secs = divmod(dt, 60)
-	print mins, "minutes and", round(secs), "seconds"
-	raw_input("[Return to exit] ")
+    s = raw_input("mode [%s] " % mode)
+    if s: mode = s
+    address = (host, port)
+    t1 = time.time()
+    local = FSProxy.FSProxyLocal()
+    remote = FSProxy.FSProxyClient(address, verbose)
+    compare(local, remote, mode)
+    remote._close()
+    local._close()
+    t2 = time.time()
+    dt = t2-t1
+    mins, secs = divmod(dt, 60)
+    print mins, "minutes and", round(secs), "seconds"
+    raw_input("[Return to exit] ")
 
 def ask(prompt, default):
-	s = raw_input("%s [%s] " % (prompt, default))
-	return s or default
+    s = raw_input("%s [%s] " % (prompt, default))
+    return s or default
 
 def askint(prompt, default):
-	s = raw_input("%s [%s] " % (prompt, str(default)))
-	if s: return string.atoi(s)
-	return default
+    s = raw_input("%s [%s] " % (prompt, str(default)))
+    if s: return string.atoi(s)
+    return default
 
 def compare(local, remote, mode):
-	print
-	print "PWD =", repr(os.getcwd())
-	sums_id = remote._send('sumlist')
-	subdirs_id = remote._send('listsubdirs')
-	remote._flush()
-	print "calculating local sums ..."
-	lsumdict = {}
-	for name, info in local.sumlist():
-		lsumdict[name] = info
-	print "getting remote sums ..."
-	sums = remote._recv(sums_id)
-	print "got", len(sums)
-	rsumdict = {}
-	for name, rsum in sums:
-		rsumdict[name] = rsum
-		if not lsumdict.has_key(name):
-			print repr(name), "only remote"
-			if 'r' in mode and 'c' in mode:
-				recvfile(local, remote, name)
-		else:
-			lsum = lsumdict[name]
-			if lsum != rsum:
-				print repr(name),
-				rmtime = remote.mtime(name)
-				lmtime = local.mtime(name)
-				if rmtime > lmtime:
-					print "remote newer",
-					if 'r' in mode:
-						recvfile(local, remote, name)
-				elif lmtime > rmtime:
-					print "local newer",
-					if 'w' in mode:
-						sendfile(local, remote, name)
-				else:
-					print "same mtime but different sum?!?!",
-				print
-	for name in lsumdict.keys():
-		if not rsumdict.keys():
-			print repr(name), "only locally",
-			fl()
-			if 'w' in mode and 'c' in mode:
-				sendfile(local, remote, name)
-			elif 'r' in mode and 'd' in mode:
-				os.unlink(name)
-				print "removed."
-			print
-	print "gettin subdirs ..."
-	subdirs = remote._recv(subdirs_id)
-	common = []
-	for name in subdirs:
-		if local.isdir(name):
-			print "Common subdirectory", repr(name)
-			common.append(name)
-		else:
-			print "Remote subdirectory", repr(name), "not found locally"
-			if 'r' in mode and 'c' in mode:
-				pr = "Create local subdirectory %s? [y] " % \
-				     repr(name)
-				if 'y' in mode:
-					ok = 'y'
-				else:
-					ok = ask(pr, "y")
-				if ok[:1] in ('y', 'Y'):
-					local.mkdir(name)
-					print "Subdirectory %s made" % \
-						repr(name)
-					common.append(name)
-	lsubdirs = local.listsubdirs()
-	for name in lsubdirs:
-		if name not in subdirs:
-			print "Local subdirectory", repr(name), "not found remotely"
-	for name in common:
-		print "Entering subdirectory", repr(name)
-		local.cd(name)
-		remote.cd(name)
-		compare(local, remote, mode)
-		remote.back()
-		local.back()
+    print
+    print "PWD =", repr(os.getcwd())
+    sums_id = remote._send('sumlist')
+    subdirs_id = remote._send('listsubdirs')
+    remote._flush()
+    print "calculating local sums ..."
+    lsumdict = {}
+    for name, info in local.sumlist():
+        lsumdict[name] = info
+    print "getting remote sums ..."
+    sums = remote._recv(sums_id)
+    print "got", len(sums)
+    rsumdict = {}
+    for name, rsum in sums:
+        rsumdict[name] = rsum
+        if not lsumdict.has_key(name):
+            print repr(name), "only remote"
+            if 'r' in mode and 'c' in mode:
+                recvfile(local, remote, name)
+        else:
+            lsum = lsumdict[name]
+            if lsum != rsum:
+                print repr(name),
+                rmtime = remote.mtime(name)
+                lmtime = local.mtime(name)
+                if rmtime > lmtime:
+                    print "remote newer",
+                    if 'r' in mode:
+                        recvfile(local, remote, name)
+                elif lmtime > rmtime:
+                    print "local newer",
+                    if 'w' in mode:
+                        sendfile(local, remote, name)
+                else:
+                    print "same mtime but different sum?!?!",
+                print
+    for name in lsumdict.keys():
+        if not rsumdict.keys():
+            print repr(name), "only locally",
+            fl()
+            if 'w' in mode and 'c' in mode:
+                sendfile(local, remote, name)
+            elif 'r' in mode and 'd' in mode:
+                os.unlink(name)
+                print "removed."
+            print
+    print "gettin subdirs ..."
+    subdirs = remote._recv(subdirs_id)
+    common = []
+    for name in subdirs:
+        if local.isdir(name):
+            print "Common subdirectory", repr(name)
+            common.append(name)
+        else:
+            print "Remote subdirectory", repr(name), "not found locally"
+            if 'r' in mode and 'c' in mode:
+                pr = "Create local subdirectory %s? [y] " % \
+                     repr(name)
+                if 'y' in mode:
+                    ok = 'y'
+                else:
+                    ok = ask(pr, "y")
+                if ok[:1] in ('y', 'Y'):
+                    local.mkdir(name)
+                    print "Subdirectory %s made" % \
+                            repr(name)
+                    common.append(name)
+    lsubdirs = local.listsubdirs()
+    for name in lsubdirs:
+        if name not in subdirs:
+            print "Local subdirectory", repr(name), "not found remotely"
+    for name in common:
+        print "Entering subdirectory", repr(name)
+        local.cd(name)
+        remote.cd(name)
+        compare(local, remote, mode)
+        remote.back()
+        local.back()
 
 def sendfile(local, remote, name):
-	try:
-		remote.create(name)
-	except (IOError, os.error), msg:
-		print "cannot create:", msg
-		return
-	
-	print "sending ...",
-	fl()
-	
-	data = open(name).read()
-	
-	t1 = time.time()
-	
-	remote._send_noreply('write', name, data)
-	remote._flush()
-	
-	t2 = time.time()
-	
-	dt = t2-t1
-	print len(data), "bytes in", round(dt), "seconds",
-	if dt:
-		print "i.e.", round(len(data)/dt), "bytes/sec",
-	print
+    try:
+        remote.create(name)
+    except (IOError, os.error), msg:
+        print "cannot create:", msg
+        return
+
+    print "sending ...",
+    fl()
+
+    data = open(name).read()
+
+    t1 = time.time()
+
+    remote._send_noreply('write', name, data)
+    remote._flush()
+
+    t2 = time.time()
+
+    dt = t2-t1
+    print len(data), "bytes in", round(dt), "seconds",
+    if dt:
+        print "i.e.", round(len(data)/dt), "bytes/sec",
+    print
 
 def recvfile(local, remote, name):
-	ok = 0
-	try:
-		rv = recvfile_real(local, remote, name)
-		ok = 1
-		return rv
-	finally:
-		if not ok:
-			print "*** recvfile of %r failed, deleting" % (name,)
-			local.delete(name)
+    ok = 0
+    try:
+        rv = recvfile_real(local, remote, name)
+        ok = 1
+        return rv
+    finally:
+        if not ok:
+            print "*** recvfile of %r failed, deleting" % (name,)
+            local.delete(name)
 
 def recvfile_real(local, remote, name):
-	try:
-		local.create(name)
-	except (IOError, os.error), msg:
-		print "cannot create:", msg
-		return
-	
-	print "receiving ...",
-	fl()
-	
-	f = open(name, 'w')
-	t1 = time.time()
-	
-	length = 4*1024
-	offset = 0
-	id = remote._send('read', name, offset, length)
-	remote._flush()
-	while 1:
-		newoffset = offset + length
-		newid = remote._send('read', name, newoffset, length)
-		data = remote._recv(id)
-		id = newid
-		if not data: break
-		f.seek(offset)
-		f.write(data)
-		offset = newoffset
-	size = f.tell()
-	
-	t2 = time.time()
-	f.close()
-	
-	dt = t2-t1
-	print size, "bytes in", round(dt), "seconds",
-	if dt:
-		print "i.e.", int(size/dt), "bytes/sec",
-	print
-	remote._recv(id) # ignored
+    try:
+        local.create(name)
+    except (IOError, os.error), msg:
+        print "cannot create:", msg
+        return
+
+    print "receiving ...",
+    fl()
+
+    f = open(name, 'w')
+    t1 = time.time()
+
+    length = 4*1024
+    offset = 0
+    id = remote._send('read', name, offset, length)
+    remote._flush()
+    while 1:
+        newoffset = offset + length
+        newid = remote._send('read', name, newoffset, length)
+        data = remote._recv(id)
+        id = newid
+        if not data: break
+        f.seek(offset)
+        f.write(data)
+        offset = newoffset
+    size = f.tell()
+
+    t2 = time.time()
+    f.close()
+
+    dt = t2-t1
+    print size, "bytes in", round(dt), "seconds",
+    if dt:
+        print "i.e.", int(size/dt), "bytes/sec",
+    print
+    remote._recv(id) # ignored
 
 def fl():
-	sys.stdout.flush()
+    sys.stdout.flush()
 
 if __name__ == '__main__':
-	main()
+    main()
diff --git a/Demo/pdist/cvslib.py b/Demo/pdist/cvslib.py
index 0f689c4..ebcc697 100755
--- a/Demo/pdist/cvslib.py
+++ b/Demo/pdist/cvslib.py
@@ -7,358 +7,358 @@
 import fnmatch
 
 if not hasattr(time, 'timezone'):
-	time.timezone = 0
+    time.timezone = 0
 
 class File:
 
-	"""Represent a file's status.
+    """Represent a file's status.
 
-	Instance variables:
+    Instance variables:
 
-	file -- the filename (no slashes), None if uninitialized
-	lseen -- true if the data for the local file is up to date
-	eseen -- true if the data from the CVS/Entries entry is up to date
-	         (this implies that the entry must be written back)
-	rseen -- true if the data for the remote file is up to date
-	proxy -- RCSProxy instance used to contact the server, or None
+    file -- the filename (no slashes), None if uninitialized
+    lseen -- true if the data for the local file is up to date
+    eseen -- true if the data from the CVS/Entries entry is up to date
+             (this implies that the entry must be written back)
+    rseen -- true if the data for the remote file is up to date
+    proxy -- RCSProxy instance used to contact the server, or None
 
-	Note that lseen and rseen don't necessary mean that a local
-	or remote file *exists* -- they indicate that we've checked it.
-	However, eseen means that this instance corresponds to an
-	entry in the CVS/Entries file.
+    Note that lseen and rseen don't necessary mean that a local
+    or remote file *exists* -- they indicate that we've checked it.
+    However, eseen means that this instance corresponds to an
+    entry in the CVS/Entries file.
 
-	If lseen is true:
-	
-	lsum -- checksum of the local file, None if no local file
-	lctime -- ctime of the local file, None if no local file
-	lmtime -- mtime of the local file, None if no local file
+    If lseen is true:
 
-	If eseen is true:
+    lsum -- checksum of the local file, None if no local file
+    lctime -- ctime of the local file, None if no local file
+    lmtime -- mtime of the local file, None if no local file
 
-	erev -- revision, None if this is a no revision (not '0')
-	enew -- true if this is an uncommitted added file
-	edeleted -- true if this is an uncommitted removed file
-	ectime -- ctime of last local file corresponding to erev
-	emtime -- mtime of last local file corresponding to erev
-	extra -- 5th string from CVS/Entries file
+    If eseen is true:
 
-	If rseen is true:
+    erev -- revision, None if this is a no revision (not '0')
+    enew -- true if this is an uncommitted added file
+    edeleted -- true if this is an uncommitted removed file
+    ectime -- ctime of last local file corresponding to erev
+    emtime -- mtime of last local file corresponding to erev
+    extra -- 5th string from CVS/Entries file
 
-	rrev -- revision of head, None if non-existent
-	rsum -- checksum of that revision, Non if non-existent
+    If rseen is true:
 
-	If eseen and rseen are both true:
-	
-	esum -- checksum of revision erev, None if no revision
+    rrev -- revision of head, None if non-existent
+    rsum -- checksum of that revision, Non if non-existent
 
-	Note
-	"""
+    If eseen and rseen are both true:
 
-	def __init__(self, file = None):
-		if file and '/' in file:
-			raise ValueError, "no slash allowed in file"
-		self.file = file
-		self.lseen = self.eseen = self.rseen = 0
-		self.proxy = None
+    esum -- checksum of revision erev, None if no revision
 
-	def __cmp__(self, other):
-		return cmp(self.file, other.file)
+    Note
+    """
 
-	def getlocal(self):
-		try:
-			self.lmtime, self.lctime = os.stat(self.file)[-2:]
-		except os.error:
-			self.lmtime = self.lctime = self.lsum = None
-		else:
-			self.lsum = md5.new(open(self.file).read()).digest()
-		self.lseen = 1
+    def __init__(self, file = None):
+        if file and '/' in file:
+            raise ValueError, "no slash allowed in file"
+        self.file = file
+        self.lseen = self.eseen = self.rseen = 0
+        self.proxy = None
 
-	def getentry(self, line):
-		words = string.splitfields(line, '/')
-		if self.file and words[1] != self.file:
-			raise ValueError, "file name mismatch"
-		self.file = words[1]
-		self.erev = words[2]
-		self.edeleted = 0
-		self.enew = 0
-		self.ectime = self.emtime = None
-		if self.erev[:1] == '-':
-			self.edeleted = 1
-			self.erev = self.erev[1:]
-		if self.erev == '0':
-			self.erev = None
-			self.enew = 1
-		else:
-			dates = words[3]
-			self.ectime = unctime(dates[:24])
-			self.emtime = unctime(dates[25:])
-		self.extra = words[4]
-		if self.rseen:
-			self.getesum()
-		self.eseen = 1
+    def __cmp__(self, other):
+        return cmp(self.file, other.file)
 
-	def getremote(self, proxy = None):
-		if proxy:
-			self.proxy = proxy
-		try:
-			self.rrev = self.proxy.head(self.file)
-		except (os.error, IOError):
-			self.rrev = None
-		if self.rrev:
-			self.rsum = self.proxy.sum(self.file)
-		else:
-			self.rsum = None
-		if self.eseen:
-			self.getesum()
-		self.rseen = 1
+    def getlocal(self):
+        try:
+            self.lmtime, self.lctime = os.stat(self.file)[-2:]
+        except os.error:
+            self.lmtime = self.lctime = self.lsum = None
+        else:
+            self.lsum = md5.new(open(self.file).read()).digest()
+        self.lseen = 1
 
-	def getesum(self):
-		if self.erev == self.rrev:
-			self.esum = self.rsum
-		elif self.erev:
-			name = (self.file, self.erev)
-			self.esum = self.proxy.sum(name)
-		else:
-			self.esum = None
+    def getentry(self, line):
+        words = string.splitfields(line, '/')
+        if self.file and words[1] != self.file:
+            raise ValueError, "file name mismatch"
+        self.file = words[1]
+        self.erev = words[2]
+        self.edeleted = 0
+        self.enew = 0
+        self.ectime = self.emtime = None
+        if self.erev[:1] == '-':
+            self.edeleted = 1
+            self.erev = self.erev[1:]
+        if self.erev == '0':
+            self.erev = None
+            self.enew = 1
+        else:
+            dates = words[3]
+            self.ectime = unctime(dates[:24])
+            self.emtime = unctime(dates[25:])
+        self.extra = words[4]
+        if self.rseen:
+            self.getesum()
+        self.eseen = 1
 
-	def putentry(self):
-		"""Return a line suitable for inclusion in CVS/Entries.
+    def getremote(self, proxy = None):
+        if proxy:
+            self.proxy = proxy
+        try:
+            self.rrev = self.proxy.head(self.file)
+        except (os.error, IOError):
+            self.rrev = None
+        if self.rrev:
+            self.rsum = self.proxy.sum(self.file)
+        else:
+            self.rsum = None
+        if self.eseen:
+            self.getesum()
+        self.rseen = 1
 
-		The returned line is terminated by a newline.
-		If no entry should be written for this file,
-		return "".
-		"""
-		if not self.eseen:
-			return ""
+    def getesum(self):
+        if self.erev == self.rrev:
+            self.esum = self.rsum
+        elif self.erev:
+            name = (self.file, self.erev)
+            self.esum = self.proxy.sum(name)
+        else:
+            self.esum = None
 
-		rev = self.erev or '0'
-		if self.edeleted:
-			rev = '-' + rev
-		if self.enew:
-			dates = 'Initial ' + self.file
-		else:
-			dates = gmctime(self.ectime) + ' ' + \
-				gmctime(self.emtime)
-		return "/%s/%s/%s/%s/\n" % (
-			self.file,
-			rev,
-			dates,
-			self.extra)
+    def putentry(self):
+        """Return a line suitable for inclusion in CVS/Entries.
 
-	def report(self):
-		print '-'*50
-		def r(key, repr=repr, self=self):
-			try:
-				value = repr(getattr(self, key))
-			except AttributeError:
-				value = "?"
-			print "%-15s:" % key, value
-		r("file")
-		if self.lseen:
-			r("lsum", hexify)
-			r("lctime", gmctime)
-			r("lmtime", gmctime)
-		if self.eseen:
-			r("erev")
-			r("enew")
-			r("edeleted")
-			r("ectime", gmctime)
-			r("emtime", gmctime)
-		if self.rseen:
-			r("rrev")
-			r("rsum", hexify)
-			if self.eseen:
-				r("esum", hexify)
+        The returned line is terminated by a newline.
+        If no entry should be written for this file,
+        return "".
+        """
+        if not self.eseen:
+            return ""
+
+        rev = self.erev or '0'
+        if self.edeleted:
+            rev = '-' + rev
+        if self.enew:
+            dates = 'Initial ' + self.file
+        else:
+            dates = gmctime(self.ectime) + ' ' + \
+                    gmctime(self.emtime)
+        return "/%s/%s/%s/%s/\n" % (
+                self.file,
+                rev,
+                dates,
+                self.extra)
+
+    def report(self):
+        print '-'*50
+        def r(key, repr=repr, self=self):
+            try:
+                value = repr(getattr(self, key))
+            except AttributeError:
+                value = "?"
+            print "%-15s:" % key, value
+        r("file")
+        if self.lseen:
+            r("lsum", hexify)
+            r("lctime", gmctime)
+            r("lmtime", gmctime)
+        if self.eseen:
+            r("erev")
+            r("enew")
+            r("edeleted")
+            r("ectime", gmctime)
+            r("emtime", gmctime)
+        if self.rseen:
+            r("rrev")
+            r("rsum", hexify)
+            if self.eseen:
+                r("esum", hexify)
 
 
 class CVS:
-	
-	"""Represent the contents of a CVS admin file (and more).
 
-	Class variables:
+    """Represent the contents of a CVS admin file (and more).
 
-	FileClass -- the class to be instantiated for entries
-	             (this should be derived from class File above)
-	IgnoreList -- shell patterns for local files to be ignored
+    Class variables:
 
-	Instance variables:
+    FileClass -- the class to be instantiated for entries
+                 (this should be derived from class File above)
+    IgnoreList -- shell patterns for local files to be ignored
 
-	entries -- a dictionary containing File instances keyed by
-	           their file name
-	proxy -- an RCSProxy instance, or None
-	"""
-	
-	FileClass = File
+    Instance variables:
 
-	IgnoreList = ['.*', '@*', ',*', '*~', '*.o', '*.a', '*.so', '*.pyc']
-	
-	def __init__(self):
-		self.entries = {}
-		self.proxy = None
-	
-	def setproxy(self, proxy):
-		if proxy is self.proxy:
-			return
-		self.proxy = proxy
-		for e in self.entries.values():
-			e.rseen = 0
-	
-	def getentries(self):
-		"""Read the contents of CVS/Entries"""
-		self.entries = {}
-		f = self.cvsopen("Entries")
-		while 1:
-			line = f.readline()
-			if not line: break
-			e = self.FileClass()
-			e.getentry(line)
-			self.entries[e.file] = e
-		f.close()
-	
-	def putentries(self):
-		"""Write CVS/Entries back"""
-		f = self.cvsopen("Entries", 'w')
-		for e in self.values():
-			f.write(e.putentry())
-		f.close()
+    entries -- a dictionary containing File instances keyed by
+               their file name
+    proxy -- an RCSProxy instance, or None
+    """
 
-	def getlocalfiles(self):
-		list = self.entries.keys()
-		addlist = os.listdir(os.curdir)
-		for name in addlist:
-			if name in list:
-				continue
-			if not self.ignored(name):
-				list.append(name)
-		list.sort()
-		for file in list:
-			try:
-				e = self.entries[file]
-			except KeyError:
-				e = self.entries[file] = self.FileClass(file)
-			e.getlocal()
+    FileClass = File
 
-	def getremotefiles(self, proxy = None):
-		if proxy:
-			self.proxy = proxy
-		if not self.proxy:
-			raise RuntimeError, "no RCS proxy"
-		addlist = self.proxy.listfiles()
-		for file in addlist:
-			try:
-				e = self.entries[file]
-			except KeyError:
-				e = self.entries[file] = self.FileClass(file)
-			e.getremote(self.proxy)
+    IgnoreList = ['.*', '@*', ',*', '*~', '*.o', '*.a', '*.so', '*.pyc']
 
-	def report(self):
-		for e in self.values():
-			e.report()
-		print '-'*50
-	
-	def keys(self):
-		keys = self.entries.keys()
-		keys.sort()
-		return keys
+    def __init__(self):
+        self.entries = {}
+        self.proxy = None
 
-	def values(self):
-		def value(key, self=self):
-			return self.entries[key]
-		return map(value, self.keys())
+    def setproxy(self, proxy):
+        if proxy is self.proxy:
+            return
+        self.proxy = proxy
+        for e in self.entries.values():
+            e.rseen = 0
 
-	def items(self):
-		def item(key, self=self):
-			return (key, self.entries[key])
-		return map(item, self.keys())
+    def getentries(self):
+        """Read the contents of CVS/Entries"""
+        self.entries = {}
+        f = self.cvsopen("Entries")
+        while 1:
+            line = f.readline()
+            if not line: break
+            e = self.FileClass()
+            e.getentry(line)
+            self.entries[e.file] = e
+        f.close()
 
-	def cvsexists(self, file):
-		file = os.path.join("CVS", file)
-		return os.path.exists(file)
-	
-	def cvsopen(self, file, mode = 'r'):
-		file = os.path.join("CVS", file)
-		if 'r' not in mode:
-			self.backup(file)
-		return open(file, mode)
-	
-	def backup(self, file):
-		if os.path.isfile(file):
-			bfile = file + '~'
-			try: os.unlink(bfile)
-			except os.error: pass
-			os.rename(file, bfile)
+    def putentries(self):
+        """Write CVS/Entries back"""
+        f = self.cvsopen("Entries", 'w')
+        for e in self.values():
+            f.write(e.putentry())
+        f.close()
 
-	def ignored(self, file):
-		if os.path.isdir(file): return True
-		for pat in self.IgnoreList:
-			if fnmatch.fnmatch(file, pat): return True
-		return False
+    def getlocalfiles(self):
+        list = self.entries.keys()
+        addlist = os.listdir(os.curdir)
+        for name in addlist:
+            if name in list:
+                continue
+            if not self.ignored(name):
+                list.append(name)
+        list.sort()
+        for file in list:
+            try:
+                e = self.entries[file]
+            except KeyError:
+                e = self.entries[file] = self.FileClass(file)
+            e.getlocal()
+
+    def getremotefiles(self, proxy = None):
+        if proxy:
+            self.proxy = proxy
+        if not self.proxy:
+            raise RuntimeError, "no RCS proxy"
+        addlist = self.proxy.listfiles()
+        for file in addlist:
+            try:
+                e = self.entries[file]
+            except KeyError:
+                e = self.entries[file] = self.FileClass(file)
+            e.getremote(self.proxy)
+
+    def report(self):
+        for e in self.values():
+            e.report()
+        print '-'*50
+
+    def keys(self):
+        keys = self.entries.keys()
+        keys.sort()
+        return keys
+
+    def values(self):
+        def value(key, self=self):
+            return self.entries[key]
+        return map(value, self.keys())
+
+    def items(self):
+        def item(key, self=self):
+            return (key, self.entries[key])
+        return map(item, self.keys())
+
+    def cvsexists(self, file):
+        file = os.path.join("CVS", file)
+        return os.path.exists(file)
+
+    def cvsopen(self, file, mode = 'r'):
+        file = os.path.join("CVS", file)
+        if 'r' not in mode:
+            self.backup(file)
+        return open(file, mode)
+
+    def backup(self, file):
+        if os.path.isfile(file):
+            bfile = file + '~'
+            try: os.unlink(bfile)
+            except os.error: pass
+            os.rename(file, bfile)
+
+    def ignored(self, file):
+        if os.path.isdir(file): return True
+        for pat in self.IgnoreList:
+            if fnmatch.fnmatch(file, pat): return True
+        return False
 
 
 # hexify and unhexify are useful to print MD5 checksums in hex format
 
 hexify_format = '%02x' * 16
 def hexify(sum):
-	"Return a hex representation of a 16-byte string (e.g. an MD5 digest)"
-	if sum is None:
-		return "None"
-	return hexify_format % tuple(map(ord, sum))
+    "Return a hex representation of a 16-byte string (e.g. an MD5 digest)"
+    if sum is None:
+        return "None"
+    return hexify_format % tuple(map(ord, sum))
 
 def unhexify(hexsum):
-	"Return the original from a hexified string"
-	if hexsum == "None":
-		return None
-	sum = ''
-	for i in range(0, len(hexsum), 2):
-		sum = sum + chr(string.atoi(hexsum[i:i+2], 16))
-	return sum
+    "Return the original from a hexified string"
+    if hexsum == "None":
+        return None
+    sum = ''
+    for i in range(0, len(hexsum), 2):
+        sum = sum + chr(string.atoi(hexsum[i:i+2], 16))
+    return sum
 
 
 unctime_monthmap = {}
 def unctime(date):
-	if date == "None": return None
-	if not unctime_monthmap:
-		months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-			  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
-		i = 0
-		for m in months:
-			i = i+1
-			unctime_monthmap[m] = i
-	words = string.split(date) # Day Mon DD HH:MM:SS YEAR
-	year = string.atoi(words[4])
-	month = unctime_monthmap[words[1]]
-	day = string.atoi(words[2])
-	[hh, mm, ss] = map(string.atoi, string.splitfields(words[3], ':'))
-	ss = ss - time.timezone
-	return time.mktime((year, month, day, hh, mm, ss, 0, 0, 0))
+    if date == "None": return None
+    if not unctime_monthmap:
+        months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
+                  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+        i = 0
+        for m in months:
+            i = i+1
+            unctime_monthmap[m] = i
+    words = string.split(date) # Day Mon DD HH:MM:SS YEAR
+    year = string.atoi(words[4])
+    month = unctime_monthmap[words[1]]
+    day = string.atoi(words[2])
+    [hh, mm, ss] = map(string.atoi, string.splitfields(words[3], ':'))
+    ss = ss - time.timezone
+    return time.mktime((year, month, day, hh, mm, ss, 0, 0, 0))
 
 def gmctime(t):
-	if t is None: return "None"
-	return time.asctime(time.gmtime(t))
+    if t is None: return "None"
+    return time.asctime(time.gmtime(t))
 
 def test_unctime():
-	now = int(time.time())
-	t = time.gmtime(now)
-	at = time.asctime(t)
-	print 'GMT', now, at
-	print 'timezone', time.timezone
-	print 'local', time.ctime(now)
-	u = unctime(at)
-	print 'unctime()', u
-	gu = time.gmtime(u)
-	print '->', gu
-	print time.asctime(gu)
+    now = int(time.time())
+    t = time.gmtime(now)
+    at = time.asctime(t)
+    print 'GMT', now, at
+    print 'timezone', time.timezone
+    print 'local', time.ctime(now)
+    u = unctime(at)
+    print 'unctime()', u
+    gu = time.gmtime(u)
+    print '->', gu
+    print time.asctime(gu)
 
 def test():
-	x = CVS()
-	x.getentries()
-	x.getlocalfiles()
-##	x.report()
-	import rcsclient
-	proxy = rcsclient.openrcsclient()
-	x.getremotefiles(proxy)
-	x.report()
+    x = CVS()
+    x.getentries()
+    x.getlocalfiles()
+##      x.report()
+    import rcsclient
+    proxy = rcsclient.openrcsclient()
+    x.getremotefiles(proxy)
+    x.report()
 
 
 if __name__ == "__main__":
-	test()
+    test()
diff --git a/Demo/pdist/cvslock.py b/Demo/pdist/cvslock.py
index 75f866e..8f6d008 100755
--- a/Demo/pdist/cvslock.py
+++ b/Demo/pdist/cvslock.py
@@ -22,25 +22,25 @@
 
 - To set a read lock:
 
-	- acquire the meta-lock
-	- create the file "#cvs.rfl.<pid>"
-	- release the meta-lock
+        - acquire the meta-lock
+        - create the file "#cvs.rfl.<pid>"
+        - release the meta-lock
 
 - To set a write lock:
 
-	- acquire the meta-lock
-	- check that there are no files called "#cvs.rfl.*"
-		- if there are, release the meta-lock, sleep, try again
-	- create the file "#cvs.wfl.<pid>"
+        - acquire the meta-lock
+        - check that there are no files called "#cvs.rfl.*"
+                - if there are, release the meta-lock, sleep, try again
+        - create the file "#cvs.wfl.<pid>"
 
 - To release a write lock:
 
-	- remove the file "#cvs.wfl.<pid>"
-	- rmdir the meta-lock
+        - remove the file "#cvs.wfl.<pid>"
+        - rmdir the meta-lock
 
 - To release a read lock:
 
-	- remove the file "#cvs.rfl.<pid>"
+        - remove the file "#cvs.rfl.<pid>"
 
 
 Additional notes
@@ -93,188 +93,188 @@
 
 class Error:
 
-	def __init__(self, msg):
-		self.msg = msg
+    def __init__(self, msg):
+        self.msg = msg
 
-	def __repr__(self):
-		return repr(self.msg)
+    def __repr__(self):
+        return repr(self.msg)
 
-	def __str__(self):
-		return str(self.msg)
+    def __str__(self):
+        return str(self.msg)
 
 
 class Locked(Error):
-	pass
+    pass
 
 
 class Lock:
 
-	def __init__(self, repository = ".", delay = DELAY):
-		self.repository = repository
-		self.delay = delay
-		self.lockdir = None
-		self.lockfile = None
-		pid = repr(os.getpid())
-		self.cvslck = self.join(CVSLCK)
-		self.cvsrfl = self.join(CVSRFL + pid)
-		self.cvswfl = self.join(CVSWFL + pid)
+    def __init__(self, repository = ".", delay = DELAY):
+        self.repository = repository
+        self.delay = delay
+        self.lockdir = None
+        self.lockfile = None
+        pid = repr(os.getpid())
+        self.cvslck = self.join(CVSLCK)
+        self.cvsrfl = self.join(CVSRFL + pid)
+        self.cvswfl = self.join(CVSWFL + pid)
 
-	def __del__(self):
-		print "__del__"
-		self.unlock()
+    def __del__(self):
+        print "__del__"
+        self.unlock()
 
-	def setlockdir(self):
-		while 1:
-			try:
-				self.lockdir = self.cvslck
-				os.mkdir(self.cvslck, 0777)
-				return
-			except os.error, msg:
-				self.lockdir = None
-				if msg[0] == EEXIST:
-					try:
-						st = os.stat(self.cvslck)
-					except os.error:
-						continue
-					self.sleep(st)
-					continue
-				raise Error("failed to lock %s: %s" % (
-					self.repository, msg))
+    def setlockdir(self):
+        while 1:
+            try:
+                self.lockdir = self.cvslck
+                os.mkdir(self.cvslck, 0777)
+                return
+            except os.error, msg:
+                self.lockdir = None
+                if msg[0] == EEXIST:
+                    try:
+                        st = os.stat(self.cvslck)
+                    except os.error:
+                        continue
+                    self.sleep(st)
+                    continue
+                raise Error("failed to lock %s: %s" % (
+                        self.repository, msg))
 
-	def unlock(self):
-		self.unlockfile()
-		self.unlockdir()
+    def unlock(self):
+        self.unlockfile()
+        self.unlockdir()
 
-	def unlockfile(self):
-		if self.lockfile:
-			print "unlink", self.lockfile
-			try:
-				os.unlink(self.lockfile)
-			except os.error:
-				pass
-			self.lockfile = None
+    def unlockfile(self):
+        if self.lockfile:
+            print "unlink", self.lockfile
+            try:
+                os.unlink(self.lockfile)
+            except os.error:
+                pass
+            self.lockfile = None
 
-	def unlockdir(self):
-		if self.lockdir:
-			print "rmdir", self.lockdir
-			try:
-				os.rmdir(self.lockdir)
-			except os.error:
-				pass
-			self.lockdir = None
+    def unlockdir(self):
+        if self.lockdir:
+            print "rmdir", self.lockdir
+            try:
+                os.rmdir(self.lockdir)
+            except os.error:
+                pass
+            self.lockdir = None
 
-	def sleep(self, st):
-		sleep(st, self.repository, self.delay)
+    def sleep(self, st):
+        sleep(st, self.repository, self.delay)
 
-	def join(self, name):
-		return os.path.join(self.repository, name)
+    def join(self, name):
+        return os.path.join(self.repository, name)
 
 
 def sleep(st, repository, delay):
-	if delay <= 0:
-		raise Locked(st)
-	uid = st[stat.ST_UID]
-	try:
-		pwent = pwd.getpwuid(uid)
-		user = pwent[0]
-	except KeyError:
-		user = "uid %d" % uid
-	print "[%s]" % time.ctime(time.time())[11:19],
-	print "Waiting for %s's lock in" % user, repository
-	time.sleep(delay)
+    if delay <= 0:
+        raise Locked(st)
+    uid = st[stat.ST_UID]
+    try:
+        pwent = pwd.getpwuid(uid)
+        user = pwent[0]
+    except KeyError:
+        user = "uid %d" % uid
+    print "[%s]" % time.ctime(time.time())[11:19],
+    print "Waiting for %s's lock in" % user, repository
+    time.sleep(delay)
 
 
 class ReadLock(Lock):
 
-	def __init__(self, repository, delay = DELAY):
-		Lock.__init__(self, repository, delay)
-		ok = 0
-		try:
-			self.setlockdir()
-			self.lockfile = self.cvsrfl
-			fp = open(self.lockfile, 'w')
-			fp.close()
-			ok = 1
-		finally:
-			if not ok:
-				self.unlockfile()
-			self.unlockdir()
+    def __init__(self, repository, delay = DELAY):
+        Lock.__init__(self, repository, delay)
+        ok = 0
+        try:
+            self.setlockdir()
+            self.lockfile = self.cvsrfl
+            fp = open(self.lockfile, 'w')
+            fp.close()
+            ok = 1
+        finally:
+            if not ok:
+                self.unlockfile()
+            self.unlockdir()
 
 
 class WriteLock(Lock):
 
-	def __init__(self, repository, delay = DELAY):
-		Lock.__init__(self, repository, delay)
-		self.setlockdir()
-		while 1:
-			uid = self.readers_exist()
-			if not uid:
-				break
-			self.unlockdir()
-			self.sleep(uid)
-		self.lockfile = self.cvswfl
-		fp = open(self.lockfile, 'w')
-		fp.close()
+    def __init__(self, repository, delay = DELAY):
+        Lock.__init__(self, repository, delay)
+        self.setlockdir()
+        while 1:
+            uid = self.readers_exist()
+            if not uid:
+                break
+            self.unlockdir()
+            self.sleep(uid)
+        self.lockfile = self.cvswfl
+        fp = open(self.lockfile, 'w')
+        fp.close()
 
-	def readers_exist(self):
-		n = len(CVSRFL)
-		for name in os.listdir(self.repository):
-			if name[:n] == CVSRFL:
-				try:
-					st = os.stat(self.join(name))
-				except os.error:
-					continue
-				return st
-		return None
+    def readers_exist(self):
+        n = len(CVSRFL)
+        for name in os.listdir(self.repository):
+            if name[:n] == CVSRFL:
+                try:
+                    st = os.stat(self.join(name))
+                except os.error:
+                    continue
+                return st
+        return None
 
 
 def MultipleWriteLock(repositories, delay = DELAY):
-	while 1:
-		locks = []
-		for r in repositories:
-			try:
-				locks.append(WriteLock(r, 0))
-			except Locked, instance:
-				del locks
-				break
-		else:
-			break
-		sleep(instance.msg, r, delay)
-	return list
+    while 1:
+        locks = []
+        for r in repositories:
+            try:
+                locks.append(WriteLock(r, 0))
+            except Locked, instance:
+                del locks
+                break
+        else:
+            break
+        sleep(instance.msg, r, delay)
+    return list
 
 
 def test():
-	import sys
-	if sys.argv[1:]:
-		repository = sys.argv[1]
-	else:
-		repository = "."
-	rl = None
-	wl = None
-	try:
-		print "attempting write lock ..."
-		wl = WriteLock(repository)
-		print "got it."
-		wl.unlock()
-		print "attempting read lock ..."
-		rl = ReadLock(repository)
-		print "got it."
-		rl.unlock()
-	finally:
-		print [1]
-		sys.exc_traceback = None
-		print [2]
-		if rl:
-			rl.unlock()
-		print [3]
-		if wl:
-			wl.unlock()
-		print [4]
-		rl = None
-		print [5]
-		wl = None
-		print [6]
+    import sys
+    if sys.argv[1:]:
+        repository = sys.argv[1]
+    else:
+        repository = "."
+    rl = None
+    wl = None
+    try:
+        print "attempting write lock ..."
+        wl = WriteLock(repository)
+        print "got it."
+        wl.unlock()
+        print "attempting read lock ..."
+        rl = ReadLock(repository)
+        print "got it."
+        rl.unlock()
+    finally:
+        print [1]
+        sys.exc_traceback = None
+        print [2]
+        if rl:
+            rl.unlock()
+        print [3]
+        if wl:
+            wl.unlock()
+        print [4]
+        rl = None
+        print [5]
+        wl = None
+        print [6]
 
 
 if __name__ == '__main__':
-	test()
+    test()
diff --git a/Demo/pdist/mac.py b/Demo/pdist/mac.py
index 516ee15..107113c 100755
--- a/Demo/pdist/mac.py
+++ b/Demo/pdist/mac.py
@@ -3,17 +3,17 @@
 import rcvs
 
 def main():
-	while 1:
-		try:
-			line = raw_input('$ ')
-		except EOFError:
-			break
-		words = string.split(line)
-		if not words:
-			continue
-		if words[0] != 'rcvs':
-			words.insert(0, 'rcvs')
-		sys.argv = words
-		rcvs.main()
+    while 1:
+        try:
+            line = raw_input('$ ')
+        except EOFError:
+            break
+        words = string.split(line)
+        if not words:
+            continue
+        if words[0] != 'rcvs':
+            words.insert(0, 'rcvs')
+        sys.argv = words
+        rcvs.main()
 
 main()
diff --git a/Demo/pdist/rcsclient.py b/Demo/pdist/rcsclient.py
index 5d88a57..d8cb004 100755
--- a/Demo/pdist/rcsclient.py
+++ b/Demo/pdist/rcsclient.py
@@ -21,51 +21,51 @@
 
 
 class RCSProxyClient(client.SecureClient):
-	
-	def __init__(self, address, verbose = client.VERBOSE):
-		client.SecureClient.__init__(self, address, verbose)
+
+    def __init__(self, address, verbose = client.VERBOSE):
+        client.SecureClient.__init__(self, address, verbose)
 
 
 def openrcsclient(opts = []):
-	"open an RCSProxy client based on a list of options returned by getopt"
-	import RCSProxy
-	host = HOST
-	port = PORT
-	verbose = VERBOSE
-	local = LOCAL
-	directory = None
-	for o, a in opts:
-		if o == '-h':
-			host = a
-			if ':' in host:
-				i = string.find(host, ':')
-				host, p = host[:i], host[i+1:]
-				if p:
-					port = string.atoi(p)
-		if o == '-p':
-			port = string.atoi(a)
-		if o == '-d':
-			directory = a
-		if o == '-v':
-			verbose = verbose + 1
-		if o == '-q':
-			verbose = 0
-		if o == '-L':
-			local = 1
-	if local:
-		import RCSProxy
-		x = RCSProxy.RCSProxyLocal()
-	else:
-		address = (host, port)
-		x = RCSProxyClient(address, verbose)
-	if not directory:
-		try:
-			directory = open(os.path.join("CVS", "Repository")).readline()
-		except IOError:
-			pass
-		else:
-			if directory[-1] == '\n':
-				directory = directory[:-1]
-	if directory:
-		x.cd(directory)
-	return x
+    "open an RCSProxy client based on a list of options returned by getopt"
+    import RCSProxy
+    host = HOST
+    port = PORT
+    verbose = VERBOSE
+    local = LOCAL
+    directory = None
+    for o, a in opts:
+        if o == '-h':
+            host = a
+            if ':' in host:
+                i = string.find(host, ':')
+                host, p = host[:i], host[i+1:]
+                if p:
+                    port = string.atoi(p)
+        if o == '-p':
+            port = string.atoi(a)
+        if o == '-d':
+            directory = a
+        if o == '-v':
+            verbose = verbose + 1
+        if o == '-q':
+            verbose = 0
+        if o == '-L':
+            local = 1
+    if local:
+        import RCSProxy
+        x = RCSProxy.RCSProxyLocal()
+    else:
+        address = (host, port)
+        x = RCSProxyClient(address, verbose)
+    if not directory:
+        try:
+            directory = open(os.path.join("CVS", "Repository")).readline()
+        except IOError:
+            pass
+        else:
+            if directory[-1] == '\n':
+                directory = directory[:-1]
+    if directory:
+        x.cd(directory)
+    return x
diff --git a/Demo/pdist/rcslib.py b/Demo/pdist/rcslib.py
index 78de111..d5f7b65 100755
--- a/Demo/pdist/rcslib.py
+++ b/Demo/pdist/rcslib.py
@@ -83,7 +83,7 @@
             if line[0] == '\t':
                 # XXX could be a lock or symbolic name
                 # Anything else?
-                continue 
+                continue
             i = string.find(line, ':')
             if i > 0:
                 key, value = line[:i], string.strip(line[i+1:])
@@ -287,7 +287,7 @@
         if reason&0x80:
             code = code + '(coredump)'
         return code, signal
- 
+
     def _system(self, cmd):
         """INTERNAL: run COMMAND in a subshell.
 
@@ -311,7 +311,7 @@
 
         If a second PATTERN argument is given, only files matching it
         are kept.  No check for valid filenames is made.
-        
+
         """
         if pat:
             def keep(name, pat = pat):
diff --git a/Demo/pdist/rcvs.py b/Demo/pdist/rcvs.py
index 24036c7..8b8bae6 100755
--- a/Demo/pdist/rcvs.py
+++ b/Demo/pdist/rcvs.py
@@ -40,188 +40,188 @@
 from cmdfw import CommandFrameWork
 
 
-DEF_LOCAL = 1				# Default -l
+DEF_LOCAL = 1                           # Default -l
 
 
 class MyFile(File):
 
-	def action(self):
-		"""Return a code indicating the update status of this file.
+    def action(self):
+        """Return a code indicating the update status of this file.
 
-		The possible return values are:
-		
-		'=' -- everything's fine
-		'0' -- file doesn't exist anywhere
-		'?' -- exists locally only
-		'A' -- new locally
-		'R' -- deleted locally
-		'U' -- changed remotely, no changes locally
-		       (includes new remotely or deleted remotely)
-		'M' -- changed locally, no changes remotely
-		'C' -- conflict: changed locally as well as remotely
-		       (includes cases where the file has been added
-		       or removed locally and remotely)
-		'D' -- deleted remotely
-		'N' -- new remotely
-		'r' -- get rid of entry
-		'c' -- create entry
-		'u' -- update entry
+        The possible return values are:
 
-		(and probably others :-)
-		"""
-		if not self.lseen:
-			self.getlocal()
-		if not self.rseen:
-			self.getremote()
-		if not self.eseen:
-			if not self.lsum:
-				if not self.rsum: return '0' # Never heard of
-				else:
-					return 'N' # New remotely
-			else: # self.lsum
-				if not self.rsum: return '?' # Local only
-				# Local and remote, but no entry
-				if self.lsum == self.rsum:
-					return 'c' # Restore entry only
-				else: return 'C' # Real conflict
-		else: # self.eseen
-			if not self.lsum:
-				if self.edeleted:
-					if self.rsum: return 'R' # Removed
-					else: return 'r' # Get rid of entry
-				else: # not self.edeleted
-					if self.rsum:
-						print "warning:",
-						print self.file,
-						print "was lost"
-						return 'U'
-					else: return 'r' # Get rid of entry
-			else: # self.lsum
-				if not self.rsum:
-					if self.enew: return 'A' # New locally
-					else: return 'D' # Deleted remotely
-				else: # self.rsum
-					if self.enew:
-						if self.lsum == self.rsum:
-							return 'u'
-						else:
-							return 'C'
-					if self.lsum == self.esum:
-						if self.esum == self.rsum:
-							return '='
-						else:
-							return 'U'
-					elif self.esum == self.rsum:
-						return 'M'
-					elif self.lsum == self.rsum:
-						return 'u'
-					else:
-						return 'C'
+        '=' -- everything's fine
+        '0' -- file doesn't exist anywhere
+        '?' -- exists locally only
+        'A' -- new locally
+        'R' -- deleted locally
+        'U' -- changed remotely, no changes locally
+               (includes new remotely or deleted remotely)
+        'M' -- changed locally, no changes remotely
+        'C' -- conflict: changed locally as well as remotely
+               (includes cases where the file has been added
+               or removed locally and remotely)
+        'D' -- deleted remotely
+        'N' -- new remotely
+        'r' -- get rid of entry
+        'c' -- create entry
+        'u' -- update entry
 
-	def update(self):
-		code = self.action()
-		if code == '=': return
-		print code, self.file
-		if code in ('U', 'N'):
-			self.get()
-		elif code == 'C':
-			print "%s: conflict resolution not yet implemented" % \
-			      self.file
-		elif code == 'D':
-			remove(self.file)
-			self.eseen = 0
-		elif code == 'r':
-			self.eseen = 0
-		elif code in ('c', 'u'):
-			self.eseen = 1
-			self.erev = self.rrev
-			self.enew = 0
-			self.edeleted = 0
-			self.esum = self.rsum
-			self.emtime, self.ectime = os.stat(self.file)[-2:]
-			self.extra = ''
+        (and probably others :-)
+        """
+        if not self.lseen:
+            self.getlocal()
+        if not self.rseen:
+            self.getremote()
+        if not self.eseen:
+            if not self.lsum:
+                if not self.rsum: return '0' # Never heard of
+                else:
+                    return 'N' # New remotely
+            else: # self.lsum
+                if not self.rsum: return '?' # Local only
+                # Local and remote, but no entry
+                if self.lsum == self.rsum:
+                    return 'c' # Restore entry only
+                else: return 'C' # Real conflict
+        else: # self.eseen
+            if not self.lsum:
+                if self.edeleted:
+                    if self.rsum: return 'R' # Removed
+                    else: return 'r' # Get rid of entry
+                else: # not self.edeleted
+                    if self.rsum:
+                        print "warning:",
+                        print self.file,
+                        print "was lost"
+                        return 'U'
+                    else: return 'r' # Get rid of entry
+            else: # self.lsum
+                if not self.rsum:
+                    if self.enew: return 'A' # New locally
+                    else: return 'D' # Deleted remotely
+                else: # self.rsum
+                    if self.enew:
+                        if self.lsum == self.rsum:
+                            return 'u'
+                        else:
+                            return 'C'
+                    if self.lsum == self.esum:
+                        if self.esum == self.rsum:
+                            return '='
+                        else:
+                            return 'U'
+                    elif self.esum == self.rsum:
+                        return 'M'
+                    elif self.lsum == self.rsum:
+                        return 'u'
+                    else:
+                        return 'C'
 
-	def commit(self, message = ""):
-		code = self.action()
-		if code in ('A', 'M'):
-			self.put(message)
-			return 1
-		elif code == 'R':
-			print "%s: committing removes not yet implemented" % \
-			      self.file
-		elif code == 'C':
-			print "%s: conflict resolution not yet implemented" % \
-			      self.file
+    def update(self):
+        code = self.action()
+        if code == '=': return
+        print code, self.file
+        if code in ('U', 'N'):
+            self.get()
+        elif code == 'C':
+            print "%s: conflict resolution not yet implemented" % \
+                  self.file
+        elif code == 'D':
+            remove(self.file)
+            self.eseen = 0
+        elif code == 'r':
+            self.eseen = 0
+        elif code in ('c', 'u'):
+            self.eseen = 1
+            self.erev = self.rrev
+            self.enew = 0
+            self.edeleted = 0
+            self.esum = self.rsum
+            self.emtime, self.ectime = os.stat(self.file)[-2:]
+            self.extra = ''
 
-	def diff(self, opts = []):
-		self.action()		# To update lseen, rseen
-		flags = ''
-		rev = self.rrev
-		# XXX should support two rev options too!
-		for o, a in opts:
-			if o == '-r':
-				rev = a
-			else:
-				flags = flags + ' ' + o + a
-		if rev == self.rrev and self.lsum == self.rsum:
-			return
-		flags = flags[1:]
-		fn = self.file
-		data = self.proxy.get((fn, rev))
-		sum = md5.new(data).digest()
-		if self.lsum == sum:
-			return
-		import tempfile
-		tf = tempfile.NamedTemporaryFile()
-		tf.write(data)
-		tf.flush()
-		print 'diff %s -r%s %s' % (flags, rev, fn)
-		sts = os.system('diff %s %s %s' % (flags, tf.name, fn))
-		if sts:
-			print '='*70
+    def commit(self, message = ""):
+        code = self.action()
+        if code in ('A', 'M'):
+            self.put(message)
+            return 1
+        elif code == 'R':
+            print "%s: committing removes not yet implemented" % \
+                  self.file
+        elif code == 'C':
+            print "%s: conflict resolution not yet implemented" % \
+                  self.file
 
-	def commitcheck(self):
-		return self.action() != 'C'
+    def diff(self, opts = []):
+        self.action()           # To update lseen, rseen
+        flags = ''
+        rev = self.rrev
+        # XXX should support two rev options too!
+        for o, a in opts:
+            if o == '-r':
+                rev = a
+            else:
+                flags = flags + ' ' + o + a
+        if rev == self.rrev and self.lsum == self.rsum:
+            return
+        flags = flags[1:]
+        fn = self.file
+        data = self.proxy.get((fn, rev))
+        sum = md5.new(data).digest()
+        if self.lsum == sum:
+            return
+        import tempfile
+        tf = tempfile.NamedTemporaryFile()
+        tf.write(data)
+        tf.flush()
+        print 'diff %s -r%s %s' % (flags, rev, fn)
+        sts = os.system('diff %s %s %s' % (flags, tf.name, fn))
+        if sts:
+            print '='*70
 
-	def put(self, message = ""):
-		print "Checking in", self.file, "..."
-		data = open(self.file).read()
-		if not self.enew:
-			self.proxy.lock(self.file)
-		messages = self.proxy.put(self.file, data, message)
-		if messages:
-			print messages
-		self.setentry(self.proxy.head(self.file), self.lsum)
-	
-	def get(self):
-		data = self.proxy.get(self.file)
-		f = open(self.file, 'w')
-		f.write(data)
-		f.close()
-		self.setentry(self.rrev, self.rsum)
+    def commitcheck(self):
+        return self.action() != 'C'
 
-	def log(self, otherflags):
-		print self.proxy.log(self.file, otherflags)
+    def put(self, message = ""):
+        print "Checking in", self.file, "..."
+        data = open(self.file).read()
+        if not self.enew:
+            self.proxy.lock(self.file)
+        messages = self.proxy.put(self.file, data, message)
+        if messages:
+            print messages
+        self.setentry(self.proxy.head(self.file), self.lsum)
 
-	def add(self):
-		self.eseen = 0		# While we're hacking...
-		self.esum = self.lsum
-		self.emtime, self.ectime = 0, 0
-		self.erev = ''
-		self.enew = 1
-		self.edeleted = 0
-		self.eseen = 1		# Done
-		self.extra = ''
+    def get(self):
+        data = self.proxy.get(self.file)
+        f = open(self.file, 'w')
+        f.write(data)
+        f.close()
+        self.setentry(self.rrev, self.rsum)
 
-	def setentry(self, erev, esum):
-		self.eseen = 0		# While we're hacking...
-		self.esum = esum
-		self.emtime, self.ectime = os.stat(self.file)[-2:]
-		self.erev = erev
-		self.enew = 0
-		self.edeleted = 0
-		self.eseen = 1		# Done
-		self.extra = ''
+    def log(self, otherflags):
+        print self.proxy.log(self.file, otherflags)
+
+    def add(self):
+        self.eseen = 0          # While we're hacking...
+        self.esum = self.lsum
+        self.emtime, self.ectime = 0, 0
+        self.erev = ''
+        self.enew = 1
+        self.edeleted = 0
+        self.eseen = 1          # Done
+        self.extra = ''
+
+    def setentry(self, erev, esum):
+        self.eseen = 0          # While we're hacking...
+        self.esum = esum
+        self.emtime, self.ectime = os.stat(self.file)[-2:]
+        self.erev = erev
+        self.enew = 0
+        self.edeleted = 0
+        self.eseen = 1          # Done
+        self.extra = ''
 
 
 SENDMAIL = "/usr/lib/sendmail -t"
@@ -231,247 +231,247 @@
 ...Message from rcvs...
 
 Committed files:
-	%s
+        %s
 
 Log message:
-	%s
+        %s
 """
 
 
 class RCVS(CVS):
 
-	FileClass = MyFile
+    FileClass = MyFile
 
-	def __init__(self):
-		CVS.__init__(self)
+    def __init__(self):
+        CVS.__init__(self)
 
-	def update(self, files):
-		for e in self.whichentries(files, 1):
-			e.update()
+    def update(self, files):
+        for e in self.whichentries(files, 1):
+            e.update()
 
-	def commit(self, files, message = ""):
-		list = self.whichentries(files)
-		if not list: return
-		ok = 1
-		for e in list:
-			if not e.commitcheck():
-				ok = 0
-		if not ok:
-			print "correct above errors first"
-			return
-		if not message:
-			message = raw_input("One-liner: ")
-		committed = []
-		for e in list:
-			if e.commit(message):
-				committed.append(e.file)
-		self.mailinfo(committed, message)
+    def commit(self, files, message = ""):
+        list = self.whichentries(files)
+        if not list: return
+        ok = 1
+        for e in list:
+            if not e.commitcheck():
+                ok = 0
+        if not ok:
+            print "correct above errors first"
+            return
+        if not message:
+            message = raw_input("One-liner: ")
+        committed = []
+        for e in list:
+            if e.commit(message):
+                committed.append(e.file)
+        self.mailinfo(committed, message)
 
-	def mailinfo(self, files, message = ""):
-		towhom = "sjoerd@cwi.nl, jack@cwi.nl" # XXX
-		mailtext = MAILFORM % (towhom, string.join(files),
-					string.join(files), message)
-		print '-'*70
-		print mailtext
-		print '-'*70
-		ok = raw_input("OK to mail to %s? " % towhom)
-		if string.lower(string.strip(ok)) in ('y', 'ye', 'yes'):
-			p = os.popen(SENDMAIL, "w")
-			p.write(mailtext)
-			sts = p.close()
-			if sts:
-				print "Sendmail exit status %s" % str(sts)
-			else:
-				print "Mail sent."
-		else:
-			print "No mail sent."
+    def mailinfo(self, files, message = ""):
+        towhom = "sjoerd@cwi.nl, jack@cwi.nl" # XXX
+        mailtext = MAILFORM % (towhom, string.join(files),
+                                string.join(files), message)
+        print '-'*70
+        print mailtext
+        print '-'*70
+        ok = raw_input("OK to mail to %s? " % towhom)
+        if string.lower(string.strip(ok)) in ('y', 'ye', 'yes'):
+            p = os.popen(SENDMAIL, "w")
+            p.write(mailtext)
+            sts = p.close()
+            if sts:
+                print "Sendmail exit status %s" % str(sts)
+            else:
+                print "Mail sent."
+        else:
+            print "No mail sent."
 
-	def report(self, files):
-		for e in self.whichentries(files):
-			e.report()
+    def report(self, files):
+        for e in self.whichentries(files):
+            e.report()
 
-	def diff(self, files, opts):
-		for e in self.whichentries(files):
-			e.diff(opts)
+    def diff(self, files, opts):
+        for e in self.whichentries(files):
+            e.diff(opts)
 
-	def add(self, files):
-		if not files:
-			raise RuntimeError, "'cvs add' needs at least one file"
-		list = []
-		for e in self.whichentries(files, 1):
-			e.add()
+    def add(self, files):
+        if not files:
+            raise RuntimeError, "'cvs add' needs at least one file"
+        list = []
+        for e in self.whichentries(files, 1):
+            e.add()
 
-	def rm(self, files):
-		if not files:
-			raise RuntimeError, "'cvs rm' needs at least one file"
-		raise RuntimeError, "'cvs rm' not yet imlemented"
+    def rm(self, files):
+        if not files:
+            raise RuntimeError, "'cvs rm' needs at least one file"
+        raise RuntimeError, "'cvs rm' not yet imlemented"
 
-	def log(self, files, opts):
-		flags = ''
-		for o, a in opts:
-			flags = flags + ' ' + o + a
-		for e in self.whichentries(files):
-			e.log(flags)
+    def log(self, files, opts):
+        flags = ''
+        for o, a in opts:
+            flags = flags + ' ' + o + a
+        for e in self.whichentries(files):
+            e.log(flags)
 
-	def whichentries(self, files, localfilestoo = 0):
-		if files:
-			list = []
-			for file in files:
-				if self.entries.has_key(file):
-					e = self.entries[file]
-				else:
-					e = self.FileClass(file)
-					self.entries[file] = e
-				list.append(e)
-		else:
-			list = self.entries.values()
-			for file in self.proxy.listfiles():
-				if self.entries.has_key(file):
-					continue
-				e = self.FileClass(file)
-				self.entries[file] = e
-				list.append(e)
-			if localfilestoo:
-				for file in os.listdir(os.curdir):
-					if not self.entries.has_key(file) \
-					   and not self.ignored(file):
-						e = self.FileClass(file)
-						self.entries[file] = e
-						list.append(e)
-			list.sort()
-		if self.proxy:
-			for e in list:
-				if e.proxy is None:
-					e.proxy = self.proxy
-		return list
+    def whichentries(self, files, localfilestoo = 0):
+        if files:
+            list = []
+            for file in files:
+                if self.entries.has_key(file):
+                    e = self.entries[file]
+                else:
+                    e = self.FileClass(file)
+                    self.entries[file] = e
+                list.append(e)
+        else:
+            list = self.entries.values()
+            for file in self.proxy.listfiles():
+                if self.entries.has_key(file):
+                    continue
+                e = self.FileClass(file)
+                self.entries[file] = e
+                list.append(e)
+            if localfilestoo:
+                for file in os.listdir(os.curdir):
+                    if not self.entries.has_key(file) \
+                       and not self.ignored(file):
+                        e = self.FileClass(file)
+                        self.entries[file] = e
+                        list.append(e)
+            list.sort()
+        if self.proxy:
+            for e in list:
+                if e.proxy is None:
+                    e.proxy = self.proxy
+        return list
 
 
 class rcvs(CommandFrameWork):
 
-	GlobalFlags = 'd:h:p:qvL'
-	UsageMessage = \
+    GlobalFlags = 'd:h:p:qvL'
+    UsageMessage = \
 "usage: rcvs [-d directory] [-h host] [-p port] [-q] [-v] [subcommand arg ...]"
-	PostUsageMessage = \
-		"If no subcommand is given, the status of all files is listed"
+    PostUsageMessage = \
+            "If no subcommand is given, the status of all files is listed"
 
-	def __init__(self):
-		"""Constructor."""
-		CommandFrameWork.__init__(self)
-		self.proxy = None
-		self.cvs = RCVS()
-		
-	def close(self):
-		if self.proxy:
-			self.proxy._close()
-		self.proxy = None
+    def __init__(self):
+        """Constructor."""
+        CommandFrameWork.__init__(self)
+        self.proxy = None
+        self.cvs = RCVS()
 
-	def recurse(self):
-		self.close()
-		names = os.listdir(os.curdir)
-		for name in names:
-			if name == os.curdir or name == os.pardir:
-				continue
-			if name == "CVS":
-				continue
-			if not os.path.isdir(name):
-				continue
-			if os.path.islink(name):
-				continue
-			print "--- entering subdirectory", name, "---"
-			os.chdir(name)
-			try:
-				if os.path.isdir("CVS"):
-					self.__class__().run()
-				else:
-					self.recurse()
-			finally:
-				os.chdir(os.pardir)
-				print "--- left subdirectory", name, "---"
+    def close(self):
+        if self.proxy:
+            self.proxy._close()
+        self.proxy = None
 
-	def options(self, opts):
-		self.opts = opts
+    def recurse(self):
+        self.close()
+        names = os.listdir(os.curdir)
+        for name in names:
+            if name == os.curdir or name == os.pardir:
+                continue
+            if name == "CVS":
+                continue
+            if not os.path.isdir(name):
+                continue
+            if os.path.islink(name):
+                continue
+            print "--- entering subdirectory", name, "---"
+            os.chdir(name)
+            try:
+                if os.path.isdir("CVS"):
+                    self.__class__().run()
+                else:
+                    self.recurse()
+            finally:
+                os.chdir(os.pardir)
+                print "--- left subdirectory", name, "---"
 
-	def ready(self):
-		import rcsclient
-		self.proxy = rcsclient.openrcsclient(self.opts)
-		self.cvs.setproxy(self.proxy)
-		self.cvs.getentries()
+    def options(self, opts):
+        self.opts = opts
 
-	def default(self):
-		self.cvs.report([])
+    def ready(self):
+        import rcsclient
+        self.proxy = rcsclient.openrcsclient(self.opts)
+        self.cvs.setproxy(self.proxy)
+        self.cvs.getentries()
 
-	def do_report(self, opts, files):
-		self.cvs.report(files)
+    def default(self):
+        self.cvs.report([])
 
-	def do_update(self, opts, files):
-		"""update [-l] [-R] [file] ..."""
-		local = DEF_LOCAL
-		for o, a in opts:
-			if o == '-l': local = 1
-			if o == '-R': local = 0
-		self.cvs.update(files)
-		self.cvs.putentries()
-		if not local and not files:
-			self.recurse()
-	flags_update = '-lR'
-	do_up = do_update
-	flags_up = flags_update
+    def do_report(self, opts, files):
+        self.cvs.report(files)
 
-	def do_commit(self, opts, files):
-		"""commit [-m message] [file] ..."""
-		message = ""
-		for o, a in opts:
-			if o == '-m': message = a
-		self.cvs.commit(files, message)
-		self.cvs.putentries()
-	flags_commit = 'm:'
-	do_com = do_commit
-	flags_com = flags_commit
+    def do_update(self, opts, files):
+        """update [-l] [-R] [file] ..."""
+        local = DEF_LOCAL
+        for o, a in opts:
+            if o == '-l': local = 1
+            if o == '-R': local = 0
+        self.cvs.update(files)
+        self.cvs.putentries()
+        if not local and not files:
+            self.recurse()
+    flags_update = '-lR'
+    do_up = do_update
+    flags_up = flags_update
 
-	def do_diff(self, opts, files):
-		"""diff [difflags] [file] ..."""
-		self.cvs.diff(files, opts)
-	flags_diff = 'cbitwcefhnlr:sD:S:'
-	do_dif = do_diff
-	flags_dif = flags_diff
+    def do_commit(self, opts, files):
+        """commit [-m message] [file] ..."""
+        message = ""
+        for o, a in opts:
+            if o == '-m': message = a
+        self.cvs.commit(files, message)
+        self.cvs.putentries()
+    flags_commit = 'm:'
+    do_com = do_commit
+    flags_com = flags_commit
 
-	def do_add(self, opts, files):
-		"""add file ..."""
-		if not files:
-			print "'rcvs add' requires at least one file"
-			return
-		self.cvs.add(files)
-		self.cvs.putentries()
+    def do_diff(self, opts, files):
+        """diff [difflags] [file] ..."""
+        self.cvs.diff(files, opts)
+    flags_diff = 'cbitwcefhnlr:sD:S:'
+    do_dif = do_diff
+    flags_dif = flags_diff
 
-	def do_remove(self, opts, files):
-		"""remove file ..."""
-		if not files:
-			print "'rcvs remove' requires at least one file"
-			return
-		self.cvs.remove(files)
-		self.cvs.putentries()
-	do_rm = do_remove
+    def do_add(self, opts, files):
+        """add file ..."""
+        if not files:
+            print "'rcvs add' requires at least one file"
+            return
+        self.cvs.add(files)
+        self.cvs.putentries()
 
-	def do_log(self, opts, files):
-		"""log [rlog-options] [file] ..."""
-		self.cvs.log(files, opts)
-	flags_log = 'bhLNRtd:s:V:r:'
+    def do_remove(self, opts, files):
+        """remove file ..."""
+        if not files:
+            print "'rcvs remove' requires at least one file"
+            return
+        self.cvs.remove(files)
+        self.cvs.putentries()
+    do_rm = do_remove
+
+    def do_log(self, opts, files):
+        """log [rlog-options] [file] ..."""
+        self.cvs.log(files, opts)
+    flags_log = 'bhLNRtd:s:V:r:'
 
 
 def remove(fn):
-	try:
-		os.unlink(fn)
-	except os.error:
-		pass
+    try:
+        os.unlink(fn)
+    except os.error:
+        pass
 
 
 def main():
-	r = rcvs()
-	try:
-		r.run()
-	finally:
-		r.close()
+    r = rcvs()
+    try:
+        r.run()
+    finally:
+        r.close()
 
 
 if __name__ == "__main__":
-	main()
+    main()
diff --git a/Demo/pdist/rrcs.py b/Demo/pdist/rrcs.py
index a07260c..4d23e6c 100755
--- a/Demo/pdist/rrcs.py
+++ b/Demo/pdist/rrcs.py
@@ -11,150 +11,150 @@
 from rcsclient import openrcsclient
 
 def main():
-	sys.stdout = sys.stderr
-	try:
-		opts, rest = getopt.getopt(sys.argv[1:], 'h:p:d:qvL')
-		if not rest:
-			cmd = 'head'
-		else:
-			cmd, rest = rest[0], rest[1:]
-		if not commands.has_key(cmd):
-			raise getopt.error, "unknown command"
-		coptset, func = commands[cmd]
-		copts, files = getopt.getopt(rest, coptset)
-	except getopt.error, msg:
-		print msg
-		print "usage: rrcs [options] command [options] [file] ..."
-		print "where command can be:"
-		print "      ci|put      # checkin the given files"
-		print "      co|get      # checkout"
-		print "      info        # print header info"
-		print "      head        # print revision of head branch"
-		print "      list        # list filename if valid"
-		print "      log         # print full log"
-		print "      diff        # diff rcs file and work file"
-		print "if no files are given, all remote rcs files are assumed"
-		sys.exit(2)
-	x = openrcsclient(opts)
-	if not files:
-		files = x.listfiles()
-	for fn in files:
-		try:
-			func(x, copts, fn)
-		except (IOError, os.error), msg:
-			print "%s: %s" % (fn, msg)
+    sys.stdout = sys.stderr
+    try:
+        opts, rest = getopt.getopt(sys.argv[1:], 'h:p:d:qvL')
+        if not rest:
+            cmd = 'head'
+        else:
+            cmd, rest = rest[0], rest[1:]
+        if not commands.has_key(cmd):
+            raise getopt.error, "unknown command"
+        coptset, func = commands[cmd]
+        copts, files = getopt.getopt(rest, coptset)
+    except getopt.error, msg:
+        print msg
+        print "usage: rrcs [options] command [options] [file] ..."
+        print "where command can be:"
+        print "      ci|put      # checkin the given files"
+        print "      co|get      # checkout"
+        print "      info        # print header info"
+        print "      head        # print revision of head branch"
+        print "      list        # list filename if valid"
+        print "      log         # print full log"
+        print "      diff        # diff rcs file and work file"
+        print "if no files are given, all remote rcs files are assumed"
+        sys.exit(2)
+    x = openrcsclient(opts)
+    if not files:
+        files = x.listfiles()
+    for fn in files:
+        try:
+            func(x, copts, fn)
+        except (IOError, os.error), msg:
+            print "%s: %s" % (fn, msg)
 
 def checkin(x, copts, fn):
-	f = open(fn)
-	data = f.read()
-	f.close()
-	new = not x.isvalid(fn)
-	if not new and same(x, copts, fn, data):
-		print "%s: unchanged since last checkin" % fn
-		return
-	print "Checking in", fn, "..."
-	message = asklogmessage(new)
-	messages = x.put(fn, data, message)
-	if messages:
-		print messages
+    f = open(fn)
+    data = f.read()
+    f.close()
+    new = not x.isvalid(fn)
+    if not new and same(x, copts, fn, data):
+        print "%s: unchanged since last checkin" % fn
+        return
+    print "Checking in", fn, "..."
+    message = asklogmessage(new)
+    messages = x.put(fn, data, message)
+    if messages:
+        print messages
 
 def checkout(x, copts, fn):
-	data = x.get(fn)
-	f = open(fn, 'w')
-	f.write(data)
-	f.close()
+    data = x.get(fn)
+    f = open(fn, 'w')
+    f.write(data)
+    f.close()
 
 def lock(x, copts, fn):
-	x.lock(fn)
+    x.lock(fn)
 
 def unlock(x, copts, fn):
-	x.unlock(fn)
+    x.unlock(fn)
 
 def info(x, copts, fn):
-	dict = x.info(fn)
-	keys = dict.keys()
-	keys.sort()
-	for key in keys:
-		print key + ':', dict[key]
-	print '='*70
+    dict = x.info(fn)
+    keys = dict.keys()
+    keys.sort()
+    for key in keys:
+        print key + ':', dict[key]
+    print '='*70
 
 def head(x, copts, fn):
-	head = x.head(fn)
-	print fn, head
+    head = x.head(fn)
+    print fn, head
 
 def list(x, copts, fn):
-	if x.isvalid(fn):
-		print fn
+    if x.isvalid(fn):
+        print fn
 
 def log(x, copts, fn):
-	flags = ''
-	for o, a in copts:
-		flags = flags + ' ' + o + a
-	flags = flags[1:]
-	messages = x.log(fn, flags)
-	print messages
+    flags = ''
+    for o, a in copts:
+        flags = flags + ' ' + o + a
+    flags = flags[1:]
+    messages = x.log(fn, flags)
+    print messages
 
 def diff(x, copts, fn):
-	if same(x, copts, fn):
-		return
-	flags = ''
-	for o, a in copts:
-		flags = flags + ' ' + o + a
-	flags = flags[1:]
-	data = x.get(fn)
-	tf = tempfile.NamedTemporaryFile()
-	tf.write(data)
-	tf.flush()
-	print 'diff %s -r%s %s' % (flags, x.head(fn), fn)
-	sts = os.system('diff %s %s %s' % (flags, tf.name, fn))
-	if sts:
-		print '='*70
+    if same(x, copts, fn):
+        return
+    flags = ''
+    for o, a in copts:
+        flags = flags + ' ' + o + a
+    flags = flags[1:]
+    data = x.get(fn)
+    tf = tempfile.NamedTemporaryFile()
+    tf.write(data)
+    tf.flush()
+    print 'diff %s -r%s %s' % (flags, x.head(fn), fn)
+    sts = os.system('diff %s %s %s' % (flags, tf.name, fn))
+    if sts:
+        print '='*70
 
 def same(x, copts, fn, data = None):
-	if data is None:
-		f = open(fn)
-		data = f.read()
-		f.close()
-	lsum = md5.new(data).digest()
-	rsum = x.sum(fn)
-	return lsum == rsum
+    if data is None:
+        f = open(fn)
+        data = f.read()
+        f.close()
+    lsum = md5.new(data).digest()
+    rsum = x.sum(fn)
+    return lsum == rsum
 
 def asklogmessage(new):
-	if new:
-		print "enter description,",
-	else:
-		print "enter log message,",
-	print "terminate with single '.' or end of file:"
-	if new:
-		print "NOTE: This is NOT the log message!"
-	message = ""
-	while 1:
-		sys.stderr.write(">> ")
-		sys.stderr.flush()
-		line = sys.stdin.readline()
-		if not line or line == '.\n': break
-		message = message + line
-	return message
+    if new:
+        print "enter description,",
+    else:
+        print "enter log message,",
+    print "terminate with single '.' or end of file:"
+    if new:
+        print "NOTE: This is NOT the log message!"
+    message = ""
+    while 1:
+        sys.stderr.write(">> ")
+        sys.stderr.flush()
+        line = sys.stdin.readline()
+        if not line or line == '.\n': break
+        message = message + line
+    return message
 
 def remove(fn):
-	try:
-		os.unlink(fn)
-	except os.error:
-		pass
+    try:
+        os.unlink(fn)
+    except os.error:
+        pass
 
 commands = {
-	'ci': ('', checkin),
-	'put': ('', checkin),
-	'co': ('', checkout),
-	'get': ('', checkout),
-	'info': ('', info),
-	'head': ('', head),
-	'list': ('', list),
-	'lock': ('', lock),
-	'unlock': ('', unlock),
-	'log': ('bhLRtd:l:r:s:w:V:', log),
-	'diff': ('c', diff),
-	}
+        'ci': ('', checkin),
+        'put': ('', checkin),
+        'co': ('', checkout),
+        'get': ('', checkout),
+        'info': ('', info),
+        'head': ('', head),
+        'list': ('', list),
+        'lock': ('', lock),
+        'unlock': ('', unlock),
+        'log': ('bhLRtd:l:r:s:w:V:', log),
+        'diff': ('c', diff),
+        }
 
 if __name__ == '__main__':
-	main()
+    main()
diff --git a/Demo/pdist/security.py b/Demo/pdist/security.py
index 0ffd511..b63081e 100755
--- a/Demo/pdist/security.py
+++ b/Demo/pdist/security.py
@@ -1,33 +1,33 @@
 class Security:
 
-	def __init__(self):
-		import os
-		env = os.environ
-		if env.has_key('PYTHON_KEYFILE'):
-			keyfile = env['PYTHON_KEYFILE']
-		else:
-			keyfile = '.python_keyfile'
-			if env.has_key('HOME'):
-				keyfile = os.path.join(env['HOME'], keyfile)
-			if not os.path.exists(keyfile):
-				import sys
-				for dir in sys.path:
-					kf = os.path.join(dir, keyfile)
-					if os.path.exists(kf):
-						keyfile = kf
-						break
-		try:
-			self._key = eval(open(keyfile).readline())
-		except IOError:
-			raise IOError, "python keyfile %s: cannot open" % keyfile
+    def __init__(self):
+        import os
+        env = os.environ
+        if env.has_key('PYTHON_KEYFILE'):
+            keyfile = env['PYTHON_KEYFILE']
+        else:
+            keyfile = '.python_keyfile'
+            if env.has_key('HOME'):
+                keyfile = os.path.join(env['HOME'], keyfile)
+            if not os.path.exists(keyfile):
+                import sys
+                for dir in sys.path:
+                    kf = os.path.join(dir, keyfile)
+                    if os.path.exists(kf):
+                        keyfile = kf
+                        break
+        try:
+            self._key = eval(open(keyfile).readline())
+        except IOError:
+            raise IOError, "python keyfile %s: cannot open" % keyfile
 
-	def _generate_challenge(self):
-		import random
-		return random.randint(100, 100000)
+    def _generate_challenge(self):
+        import random
+        return random.randint(100, 100000)
 
-	def _compare_challenge_response(self, challenge, response):
-		return self._encode_challenge(challenge) == response
+    def _compare_challenge_response(self, challenge, response):
+        return self._encode_challenge(challenge) == response
 
-	def _encode_challenge(self, challenge):
-		p, m = self._key
-		return pow(long(challenge), p, m)
+    def _encode_challenge(self, challenge):
+        p, m = self._key
+        return pow(long(challenge), p, m)
diff --git a/Demo/pdist/server.py b/Demo/pdist/server.py
index 4e4ab0d..e692eea 100755
--- a/Demo/pdist/server.py
+++ b/Demo/pdist/server.py
@@ -12,103 +12,103 @@
 
 
 class Server:
-	
-	"""RPC Server class.  Derive a class to implement a particular service."""
-	
-	def __init__(self, address, verbose = VERBOSE):
-		if type(address) == type(0):
-			address = ('', address)
-		self._address = address
-		self._verbose = verbose
-		self._socket = None
-		self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-		self._socket.bind(address)
-		self._socket.listen(1)
-		self._listening = 1
-	
-	def _setverbose(self, verbose):
-		self._verbose = verbose
-	
-	def __del__(self):
-		self._close()
-	
-	def _close(self):
-		self._listening = 0
-		if self._socket:
-			self._socket.close()
-		self._socket = None
-	
-	def _serverloop(self):
-		while self._listening:
-			self._serve()
-	
-	def _serve(self):
-		if self._verbose: print "Wait for connection ..."
-		conn, address = self._socket.accept()
-		if self._verbose: print "Accepted connection from %s" % repr(address)
-		if not self._verify(conn, address):
-			print "*** Connection from %s refused" % repr(address)
-			conn.close()
-			return
-		rf = conn.makefile('r')
-		wf = conn.makefile('w')
-		ok = 1
-		while ok:
-			wf.flush()
-			if self._verbose > 1: print "Wait for next request ..."
-			ok = self._dorequest(rf, wf)
-	
-	_valid = ['192.16.201.*', '192.16.197.*', '132.151.1.*', '129.6.64.*']
-	
-	def _verify(self, conn, address):
-		host, port = address
-		for pat in self._valid:
-			if fnmatch(host, pat): return 1
-		return 0
-	
-	def _dorequest(self, rf, wf):
-		rp = pickle.Unpickler(rf)
-		try:
-			request = rp.load()
-		except EOFError:
-			return 0
-		if self._verbose > 1: print "Got request: %s" % repr(request)
-		try:
-			methodname, args, id = request
-			if '.' in methodname:
-				reply = (None, self._special(methodname, args), id)
-			elif methodname[0] == '_':
-				raise NameError, "illegal method name %s" % repr(methodname)
-			else:
-				method = getattr(self, methodname)
-				reply = (None, apply(method, args), id)
-		except:
-			reply = (sys.exc_type, sys.exc_value, id)
-		if id < 0 and reply[:2] == (None, None):
-			if self._verbose > 1: print "Suppress reply"
-			return 1
-		if self._verbose > 1: print "Send reply: %s" % repr(reply)
-		wp = pickle.Pickler(wf)
-		wp.dump(reply)
-		return 1
-	
-	def _special(self, methodname, args):
-		if methodname == '.methods':
-			if not hasattr(self, '_methods'):
-				self._methods = tuple(self._listmethods())
-			return self._methods
-		raise NameError, "unrecognized special method name %s" % repr(methodname)
-	
-	def _listmethods(self, cl=None):
-		if not cl: cl = self.__class__
-		names = cl.__dict__.keys()
-		names = filter(lambda x: x[0] != '_', names)
-		names.sort()
-		for base in cl.__bases__:
-			basenames = self._listmethods(base)
-			basenames = filter(lambda x, names=names: x not in names, basenames)
-			names[len(names):] = basenames
-		return names
+
+    """RPC Server class.  Derive a class to implement a particular service."""
+
+    def __init__(self, address, verbose = VERBOSE):
+        if type(address) == type(0):
+            address = ('', address)
+        self._address = address
+        self._verbose = verbose
+        self._socket = None
+        self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self._socket.bind(address)
+        self._socket.listen(1)
+        self._listening = 1
+
+    def _setverbose(self, verbose):
+        self._verbose = verbose
+
+    def __del__(self):
+        self._close()
+
+    def _close(self):
+        self._listening = 0
+        if self._socket:
+            self._socket.close()
+        self._socket = None
+
+    def _serverloop(self):
+        while self._listening:
+            self._serve()
+
+    def _serve(self):
+        if self._verbose: print "Wait for connection ..."
+        conn, address = self._socket.accept()
+        if self._verbose: print "Accepted connection from %s" % repr(address)
+        if not self._verify(conn, address):
+            print "*** Connection from %s refused" % repr(address)
+            conn.close()
+            return
+        rf = conn.makefile('r')
+        wf = conn.makefile('w')
+        ok = 1
+        while ok:
+            wf.flush()
+            if self._verbose > 1: print "Wait for next request ..."
+            ok = self._dorequest(rf, wf)
+
+    _valid = ['192.16.201.*', '192.16.197.*', '132.151.1.*', '129.6.64.*']
+
+    def _verify(self, conn, address):
+        host, port = address
+        for pat in self._valid:
+            if fnmatch(host, pat): return 1
+        return 0
+
+    def _dorequest(self, rf, wf):
+        rp = pickle.Unpickler(rf)
+        try:
+            request = rp.load()
+        except EOFError:
+            return 0
+        if self._verbose > 1: print "Got request: %s" % repr(request)
+        try:
+            methodname, args, id = request
+            if '.' in methodname:
+                reply = (None, self._special(methodname, args), id)
+            elif methodname[0] == '_':
+                raise NameError, "illegal method name %s" % repr(methodname)
+            else:
+                method = getattr(self, methodname)
+                reply = (None, apply(method, args), id)
+        except:
+            reply = (sys.exc_type, sys.exc_value, id)
+        if id < 0 and reply[:2] == (None, None):
+            if self._verbose > 1: print "Suppress reply"
+            return 1
+        if self._verbose > 1: print "Send reply: %s" % repr(reply)
+        wp = pickle.Pickler(wf)
+        wp.dump(reply)
+        return 1
+
+    def _special(self, methodname, args):
+        if methodname == '.methods':
+            if not hasattr(self, '_methods'):
+                self._methods = tuple(self._listmethods())
+            return self._methods
+        raise NameError, "unrecognized special method name %s" % repr(methodname)
+
+    def _listmethods(self, cl=None):
+        if not cl: cl = self.__class__
+        names = cl.__dict__.keys()
+        names = filter(lambda x: x[0] != '_', names)
+        names.sort()
+        for base in cl.__bases__:
+            basenames = self._listmethods(base)
+            basenames = filter(lambda x, names=names: x not in names, basenames)
+            names[len(names):] = basenames
+        return names
 
 
 from security import Security
@@ -116,30 +116,30 @@
 
 class SecureServer(Server, Security):
 
-	def __init__(self, *args):
-		apply(Server.__init__, (self,) + args)
-		Security.__init__(self)
+    def __init__(self, *args):
+        apply(Server.__init__, (self,) + args)
+        Security.__init__(self)
 
-	def _verify(self, conn, address):
-		import string
-		challenge = self._generate_challenge()
-		conn.send("%d\n" % challenge)
-		response = ""
-		while "\n" not in response and len(response) < 100:
-			data = conn.recv(100)
-			if not data:
-				break
-			response = response + data
-		try:
-			response = string.atol(string.strip(response))
-		except string.atol_error:
-			if self._verbose > 0:
-				print "Invalid response syntax", repr(response)
-			return 0
-		if not self._compare_challenge_response(challenge, response):
-			if self._verbose > 0:
-				print "Invalid response value", repr(response)
-			return 0
-		if self._verbose > 1:
-			print "Response matches challenge.  Go ahead!"
-		return 1
+    def _verify(self, conn, address):
+        import string
+        challenge = self._generate_challenge()
+        conn.send("%d\n" % challenge)
+        response = ""
+        while "\n" not in response and len(response) < 100:
+            data = conn.recv(100)
+            if not data:
+                break
+            response = response + data
+        try:
+            response = string.atol(string.strip(response))
+        except string.atol_error:
+            if self._verbose > 0:
+                print "Invalid response syntax", repr(response)
+            return 0
+        if not self._compare_challenge_response(challenge, response):
+            if self._verbose > 0:
+                print "Invalid response value", repr(response)
+            return 0
+        if self._verbose > 1:
+            print "Response matches challenge.  Go ahead!"
+        return 1
diff --git a/Demo/pdist/sumtree.py b/Demo/pdist/sumtree.py
index 92c1fd0..9291a56 100755
--- a/Demo/pdist/sumtree.py
+++ b/Demo/pdist/sumtree.py
@@ -2,23 +2,23 @@
 import FSProxy
 
 def main():
-	t1 = time.time()
-	#proxy = FSProxy.FSProxyClient(('voorn.cwi.nl', 4127))
-	proxy = FSProxy.FSProxyLocal()
-	sumtree(proxy)
-	proxy._close()
-	t2 = time.time()
-	print t2-t1, "seconds"
-	raw_input("[Return to exit] ")
+    t1 = time.time()
+    #proxy = FSProxy.FSProxyClient(('voorn.cwi.nl', 4127))
+    proxy = FSProxy.FSProxyLocal()
+    sumtree(proxy)
+    proxy._close()
+    t2 = time.time()
+    print t2-t1, "seconds"
+    raw_input("[Return to exit] ")
 
 def sumtree(proxy):
-	print "PWD =", proxy.pwd()
-	files = proxy.listfiles()
-	proxy.infolist(files)
-	subdirs = proxy.listsubdirs()
-	for name in subdirs:
-		proxy.cd(name)
-		sumtree(proxy)
-		proxy.back()
+    print "PWD =", proxy.pwd()
+    files = proxy.listfiles()
+    proxy.infolist(files)
+    subdirs = proxy.listsubdirs()
+    for name in subdirs:
+        proxy.cd(name)
+        sumtree(proxy)
+        proxy.back()
 
 main()
diff --git a/Demo/rpc/T.py b/Demo/rpc/T.py
index 2adf486..3325507 100644
--- a/Demo/rpc/T.py
+++ b/Demo/rpc/T.py
@@ -4,19 +4,19 @@
 import sys, os, time
 
 def TSTART():
-	global t0, t1
-	u, s, cu, cs = os.times()
-	t0 = u+cu, s+cs, time.time()
+    global t0, t1
+    u, s, cu, cs = os.times()
+    t0 = u+cu, s+cs, time.time()
 
 def TSTOP(*label):
-	global t0, t1
-	u, s, cu, cs = os.times()
-	t1 = u+cu, s+cs, time.time()
-	tt = []
-	for i in range(3):
-		tt.append(t1[i] - t0[i])
-	[u, s, r] = tt
-	msg = ''
-	for x in label: msg = msg + (x + ' ')
-	msg = msg + '%r user, %r sys, %r real\n' % (u, s, r)
-	sys.stderr.write(msg)
+    global t0, t1
+    u, s, cu, cs = os.times()
+    t1 = u+cu, s+cs, time.time()
+    tt = []
+    for i in range(3):
+        tt.append(t1[i] - t0[i])
+    [u, s, r] = tt
+    msg = ''
+    for x in label: msg = msg + (x + ' ')
+    msg = msg + '%r user, %r sys, %r real\n' % (u, s, r)
+    sys.stderr.write(msg)
diff --git a/Demo/rpc/mountclient.py b/Demo/rpc/mountclient.py
index 8a4b1b6..318a9d9 100644
--- a/Demo/rpc/mountclient.py
+++ b/Demo/rpc/mountclient.py
@@ -26,8 +26,8 @@
 
 class MountPacker(Packer):
 
-	def pack_fhandle(self, fhandle):
-		self.pack_fopaque(FHSIZE, fhandle)
+    def pack_fhandle(self, fhandle):
+        self.pack_fopaque(FHSIZE, fhandle)
 
 
 # Unpacker derived class for Mount protocol clients.
@@ -39,35 +39,35 @@
 
 class MountUnpacker(Unpacker):
 
-	def unpack_fhandle(self):
-		return self.unpack_fopaque(FHSIZE)
+    def unpack_fhandle(self):
+        return self.unpack_fopaque(FHSIZE)
 
-	def unpack_fhstatus(self):
-		status = self.unpack_uint()
-		if status == 0:
-			fh = self.unpack_fhandle()
-		else:
-			fh = None
-		return status, fh
+    def unpack_fhstatus(self):
+        status = self.unpack_uint()
+        if status == 0:
+            fh = self.unpack_fhandle()
+        else:
+            fh = None
+        return status, fh
 
-	def unpack_mountlist(self):
-		return self.unpack_list(self.unpack_mountstruct)
+    def unpack_mountlist(self):
+        return self.unpack_list(self.unpack_mountstruct)
 
-	def unpack_mountstruct(self):
-		hostname = self.unpack_string()
-		directory = self.unpack_string()
-		return (hostname, directory)
+    def unpack_mountstruct(self):
+        hostname = self.unpack_string()
+        directory = self.unpack_string()
+        return (hostname, directory)
 
-	def unpack_exportlist(self):
-		return self.unpack_list(self.unpack_exportstruct)
+    def unpack_exportlist(self):
+        return self.unpack_list(self.unpack_exportstruct)
 
-	def unpack_exportstruct(self):
-		filesys = self.unpack_string()
-		groups = self.unpack_groups()
-		return (filesys, groups)
+    def unpack_exportstruct(self):
+        filesys = self.unpack_string()
+        groups = self.unpack_groups()
+        return (filesys, groups)
 
-	def unpack_groups(self):
-		return self.unpack_list(self.unpack_string)
+    def unpack_groups(self):
+        return self.unpack_list(self.unpack_string)
 
 
 # These are the procedures specific to the Mount client class.
@@ -75,84 +75,84 @@
 
 class PartialMountClient:
 
-	# This method is called by Client.__init__ to initialize
-	# self.packer and self.unpacker
-	def addpackers(self):
-		self.packer = MountPacker()
-		self.unpacker = MountUnpacker('')
+    # This method is called by Client.__init__ to initialize
+    # self.packer and self.unpacker
+    def addpackers(self):
+        self.packer = MountPacker()
+        self.unpacker = MountUnpacker('')
 
-	# This method is called by Client.__init__ to bind the socket
-	# to a particular network interface and port.  We use the
-	# default network interface, but if we're running as root,
-	# we want to bind to a reserved port
-	def bindsocket(self):
-		import os
-		try:
-			uid = os.getuid()
-		except AttributeError:
-			uid = 1
-		if uid == 0:
-			port = rpc.bindresvport(self.sock, '')
-			# 'port' is not used
-		else:
-			self.sock.bind(('', 0))
+    # This method is called by Client.__init__ to bind the socket
+    # to a particular network interface and port.  We use the
+    # default network interface, but if we're running as root,
+    # we want to bind to a reserved port
+    def bindsocket(self):
+        import os
+        try:
+            uid = os.getuid()
+        except AttributeError:
+            uid = 1
+        if uid == 0:
+            port = rpc.bindresvport(self.sock, '')
+            # 'port' is not used
+        else:
+            self.sock.bind(('', 0))
 
-	# This function is called to cough up a suitable
-	# authentication object for a call to procedure 'proc'.
-	def mkcred(self):
-		if self.cred == None:
-			self.cred = rpc.AUTH_UNIX, rpc.make_auth_unix_default()
-		return self.cred
+    # This function is called to cough up a suitable
+    # authentication object for a call to procedure 'proc'.
+    def mkcred(self):
+        if self.cred == None:
+            self.cred = rpc.AUTH_UNIX, rpc.make_auth_unix_default()
+        return self.cred
 
-	# The methods Mnt, Dump etc. each implement one Remote
-	# Procedure Call.  This is done by calling self.make_call()
-	# with as arguments:
-	#
-	# - the procedure number
-	# - the arguments (or None)
-	# - the "packer" function for the arguments (or None)
-	# - the "unpacker" function for the return value (or None)
-	#
-	# The packer and unpacker function, if not None, *must* be
-	# methods of self.packer and self.unpacker, respectively.
-	# A value of None means that there are no arguments or is no
-	# return value, respectively.
-	#
-	# The return value from make_call() is the return value from
-	# the remote procedure call, as unpacked by the "unpacker"
-	# function, or None if the unpacker function is None.
-	#
-	# (Even if you expect a result of None, you should still
-	# return the return value from make_call(), since this may be
-	# needed by a broadcasting version of the class.)
-	#
-	# If the call fails, make_call() raises an exception
-	# (this includes time-outs and invalid results).
-	#
-	# Note that (at least with the UDP protocol) there is no
-	# guarantee that a call is executed at most once.  When you do
-	# get a reply, you know it has been executed at least once;
-	# when you don't get a reply, you know nothing.
+    # The methods Mnt, Dump etc. each implement one Remote
+    # Procedure Call.  This is done by calling self.make_call()
+    # with as arguments:
+    #
+    # - the procedure number
+    # - the arguments (or None)
+    # - the "packer" function for the arguments (or None)
+    # - the "unpacker" function for the return value (or None)
+    #
+    # The packer and unpacker function, if not None, *must* be
+    # methods of self.packer and self.unpacker, respectively.
+    # A value of None means that there are no arguments or is no
+    # return value, respectively.
+    #
+    # The return value from make_call() is the return value from
+    # the remote procedure call, as unpacked by the "unpacker"
+    # function, or None if the unpacker function is None.
+    #
+    # (Even if you expect a result of None, you should still
+    # return the return value from make_call(), since this may be
+    # needed by a broadcasting version of the class.)
+    #
+    # If the call fails, make_call() raises an exception
+    # (this includes time-outs and invalid results).
+    #
+    # Note that (at least with the UDP protocol) there is no
+    # guarantee that a call is executed at most once.  When you do
+    # get a reply, you know it has been executed at least once;
+    # when you don't get a reply, you know nothing.
 
-	def Mnt(self, directory):
-		return self.make_call(1, directory, \
-			self.packer.pack_string, \
-			self.unpacker.unpack_fhstatus)
+    def Mnt(self, directory):
+        return self.make_call(1, directory, \
+                self.packer.pack_string, \
+                self.unpacker.unpack_fhstatus)
 
-	def Dump(self):
-		return self.make_call(2, None, \
-			None, self.unpacker.unpack_mountlist)
+    def Dump(self):
+        return self.make_call(2, None, \
+                None, self.unpacker.unpack_mountlist)
 
-	def Umnt(self, directory):
-		return self.make_call(3, directory, \
-			self.packer.pack_string, None)
+    def Umnt(self, directory):
+        return self.make_call(3, directory, \
+                self.packer.pack_string, None)
 
-	def Umntall(self):
-		return self.make_call(4, None, None, None)
+    def Umntall(self):
+        return self.make_call(4, None, None, None)
 
-	def Export(self):
-		return self.make_call(5, None, \
-			None, self.unpacker.unpack_exportlist)
+    def Export(self):
+        return self.make_call(5, None, \
+                None, self.unpacker.unpack_exportlist)
 
 
 # We turn the partial Mount client into a full one for either protocol
@@ -162,14 +162,14 @@
 
 class TCPMountClient(PartialMountClient, TCPClient):
 
-	def __init__(self, host):
-		TCPClient.__init__(self, host, MOUNTPROG, MOUNTVERS)
+    def __init__(self, host):
+        TCPClient.__init__(self, host, MOUNTPROG, MOUNTVERS)
 
 
 class UDPMountClient(PartialMountClient, UDPClient):
 
-	def __init__(self, host):
-		UDPClient.__init__(self, host, MOUNTPROG, MOUNTVERS)
+    def __init__(self, host):
+        UDPClient.__init__(self, host, MOUNTPROG, MOUNTVERS)
 
 
 # A little test program for the Mount client.  This takes a host as
@@ -179,24 +179,24 @@
 # (TCP or UDP), default is UDP.
 
 def test():
-	import sys
-	if sys.argv[1:] and sys.argv[1] == '-t':
-		C = TCPMountClient
-		del sys.argv[1]
-	elif sys.argv[1:] and sys.argv[1] == '-u':
-		C = UDPMountClient
-		del sys.argv[1]
-	else:
-		C = UDPMountClient
-	if sys.argv[1:]: host = sys.argv[1]
-	else: host = ''
-	mcl = C(host)
-	list = mcl.Export()
-	for item in list:
-		print item
-		try:
-			mcl.Mnt(item[0])
-		except:
-			print 'Sorry'
-			continue
-		mcl.Umnt(item[0])
+    import sys
+    if sys.argv[1:] and sys.argv[1] == '-t':
+        C = TCPMountClient
+        del sys.argv[1]
+    elif sys.argv[1:] and sys.argv[1] == '-u':
+        C = UDPMountClient
+        del sys.argv[1]
+    else:
+        C = UDPMountClient
+    if sys.argv[1:]: host = sys.argv[1]
+    else: host = ''
+    mcl = C(host)
+    list = mcl.Export()
+    for item in list:
+        print item
+        try:
+            mcl.Mnt(item[0])
+        except:
+            print 'Sorry'
+            continue
+        mcl.Umnt(item[0])
diff --git a/Demo/rpc/nfsclient.py b/Demo/rpc/nfsclient.py
index 37ec46c..c4387b4 100644
--- a/Demo/rpc/nfsclient.py
+++ b/Demo/rpc/nfsclient.py
@@ -28,174 +28,174 @@
 
 class NFSPacker(MountPacker):
 
-	def pack_sattrargs(self, sa):
-		file, attributes = sa
-		self.pack_fhandle(file)
-		self.pack_sattr(attributes)
+    def pack_sattrargs(self, sa):
+        file, attributes = sa
+        self.pack_fhandle(file)
+        self.pack_sattr(attributes)
 
-	def pack_sattr(self, sa):
-		mode, uid, gid, size, atime, mtime = sa
-		self.pack_uint(mode)
-		self.pack_uint(uid)
-		self.pack_uint(gid)
-		self.pack_uint(size)
-		self.pack_timeval(atime)
-		self.pack_timeval(mtime)
+    def pack_sattr(self, sa):
+        mode, uid, gid, size, atime, mtime = sa
+        self.pack_uint(mode)
+        self.pack_uint(uid)
+        self.pack_uint(gid)
+        self.pack_uint(size)
+        self.pack_timeval(atime)
+        self.pack_timeval(mtime)
 
-	def pack_diropargs(self, da):
-		dir, name = da
-		self.pack_fhandle(dir)
-		self.pack_string(name)
+    def pack_diropargs(self, da):
+        dir, name = da
+        self.pack_fhandle(dir)
+        self.pack_string(name)
 
-	def pack_readdirargs(self, ra):
-		dir, cookie, count = ra
-		self.pack_fhandle(dir)
-		self.pack_uint(cookie)
-		self.pack_uint(count)
+    def pack_readdirargs(self, ra):
+        dir, cookie, count = ra
+        self.pack_fhandle(dir)
+        self.pack_uint(cookie)
+        self.pack_uint(count)
 
-	def pack_timeval(self, tv):
-		secs, usecs = tv
-		self.pack_uint(secs)
-		self.pack_uint(usecs)
+    def pack_timeval(self, tv):
+        secs, usecs = tv
+        self.pack_uint(secs)
+        self.pack_uint(usecs)
 
 
 class NFSUnpacker(MountUnpacker):
 
-	def unpack_readdirres(self):
-		status = self.unpack_enum()
-		if status == NFS_OK:
-			entries = self.unpack_list(self.unpack_entry)
-			eof = self.unpack_bool()
-			rest = (entries, eof)
-		else:
-			rest = None
-		return (status, rest)
+    def unpack_readdirres(self):
+        status = self.unpack_enum()
+        if status == NFS_OK:
+            entries = self.unpack_list(self.unpack_entry)
+            eof = self.unpack_bool()
+            rest = (entries, eof)
+        else:
+            rest = None
+        return (status, rest)
 
-	def unpack_entry(self):
-		fileid = self.unpack_uint()
-		name = self.unpack_string()
-		cookie = self.unpack_uint()
-		return (fileid, name, cookie)
+    def unpack_entry(self):
+        fileid = self.unpack_uint()
+        name = self.unpack_string()
+        cookie = self.unpack_uint()
+        return (fileid, name, cookie)
 
-	def unpack_diropres(self):
-		status = self.unpack_enum()
-		if status == NFS_OK:
-			fh = self.unpack_fhandle()
-			fa = self.unpack_fattr()
-			rest = (fh, fa)
-		else:
-			rest = None
-		return (status, rest)
+    def unpack_diropres(self):
+        status = self.unpack_enum()
+        if status == NFS_OK:
+            fh = self.unpack_fhandle()
+            fa = self.unpack_fattr()
+            rest = (fh, fa)
+        else:
+            rest = None
+        return (status, rest)
 
-	def unpack_attrstat(self):
-		status = self.unpack_enum()
-		if status == NFS_OK:
-			attributes = self.unpack_fattr()
-		else:
-			attributes = None
-		return status, attributes
+    def unpack_attrstat(self):
+        status = self.unpack_enum()
+        if status == NFS_OK:
+            attributes = self.unpack_fattr()
+        else:
+            attributes = None
+        return status, attributes
 
-	def unpack_fattr(self):
-		type = self.unpack_enum()
-		mode = self.unpack_uint()
-		nlink = self.unpack_uint()
-		uid = self.unpack_uint()
-		gid = self.unpack_uint()
-		size = self.unpack_uint()
-		blocksize = self.unpack_uint()
-		rdev = self.unpack_uint()
-		blocks = self.unpack_uint()
-		fsid = self.unpack_uint()
-		fileid = self.unpack_uint()
-		atime = self.unpack_timeval()
-		mtime = self.unpack_timeval()
-		ctime = self.unpack_timeval()
-		return (type, mode, nlink, uid, gid, size, blocksize, \
-			rdev, blocks, fsid, fileid, atime, mtime, ctime)
+    def unpack_fattr(self):
+        type = self.unpack_enum()
+        mode = self.unpack_uint()
+        nlink = self.unpack_uint()
+        uid = self.unpack_uint()
+        gid = self.unpack_uint()
+        size = self.unpack_uint()
+        blocksize = self.unpack_uint()
+        rdev = self.unpack_uint()
+        blocks = self.unpack_uint()
+        fsid = self.unpack_uint()
+        fileid = self.unpack_uint()
+        atime = self.unpack_timeval()
+        mtime = self.unpack_timeval()
+        ctime = self.unpack_timeval()
+        return (type, mode, nlink, uid, gid, size, blocksize, \
+                rdev, blocks, fsid, fileid, atime, mtime, ctime)
 
-	def unpack_timeval(self):
-		secs = self.unpack_uint()
-		usecs = self.unpack_uint()
-		return (secs, usecs)
+    def unpack_timeval(self):
+        secs = self.unpack_uint()
+        usecs = self.unpack_uint()
+        return (secs, usecs)
 
 
 class NFSClient(UDPClient):
 
-	def __init__(self, host):
-		UDPClient.__init__(self, host, NFS_PROGRAM, NFS_VERSION)
+    def __init__(self, host):
+        UDPClient.__init__(self, host, NFS_PROGRAM, NFS_VERSION)
 
-	def addpackers(self):
-		self.packer = NFSPacker()
-		self.unpacker = NFSUnpacker('')
+    def addpackers(self):
+        self.packer = NFSPacker()
+        self.unpacker = NFSUnpacker('')
 
-	def mkcred(self):
-		if self.cred == None:
-			self.cred = rpc.AUTH_UNIX, rpc.make_auth_unix_default()
-		return self.cred
+    def mkcred(self):
+        if self.cred == None:
+            self.cred = rpc.AUTH_UNIX, rpc.make_auth_unix_default()
+        return self.cred
 
-	def Getattr(self, fh):
-		return self.make_call(1, fh, \
-			self.packer.pack_fhandle, \
-			self.unpacker.unpack_attrstat)
+    def Getattr(self, fh):
+        return self.make_call(1, fh, \
+                self.packer.pack_fhandle, \
+                self.unpacker.unpack_attrstat)
 
-	def Setattr(self, sa):
-		return self.make_call(2, sa, \
-			self.packer.pack_sattrargs, \
-			self.unpacker.unpack_attrstat)
+    def Setattr(self, sa):
+        return self.make_call(2, sa, \
+                self.packer.pack_sattrargs, \
+                self.unpacker.unpack_attrstat)
 
-	# Root() is obsolete
+    # Root() is obsolete
 
-	def Lookup(self, da):
-		return self.make_call(4, da, \
-			self.packer.pack_diropargs, \
-			self.unpacker.unpack_diropres)
+    def Lookup(self, da):
+        return self.make_call(4, da, \
+                self.packer.pack_diropargs, \
+                self.unpacker.unpack_diropres)
 
-	# ...
+    # ...
 
-	def Readdir(self, ra):
-		return self.make_call(16, ra, \
-			self.packer.pack_readdirargs, \
-			self.unpacker.unpack_readdirres)
+    def Readdir(self, ra):
+        return self.make_call(16, ra, \
+                self.packer.pack_readdirargs, \
+                self.unpacker.unpack_readdirres)
 
-	# Shorthand to get the entire contents of a directory
-	def Listdir(self, dir):
-		list = []
-		ra = (dir, 0, 2000)
-		while 1:
-			(status, rest) = self.Readdir(ra)
-			if status <> NFS_OK:
-				break
-			entries, eof = rest
-			last_cookie = None
-			for fileid, name, cookie in entries:
-				list.append((fileid, name))
-				last_cookie = cookie
-			if eof or last_cookie == None:
-				break
-			ra = (ra[0], last_cookie, ra[2])
-		return list
+    # Shorthand to get the entire contents of a directory
+    def Listdir(self, dir):
+        list = []
+        ra = (dir, 0, 2000)
+        while 1:
+            (status, rest) = self.Readdir(ra)
+            if status <> NFS_OK:
+                break
+            entries, eof = rest
+            last_cookie = None
+            for fileid, name, cookie in entries:
+                list.append((fileid, name))
+                last_cookie = cookie
+            if eof or last_cookie == None:
+                break
+            ra = (ra[0], last_cookie, ra[2])
+        return list
 
-	
+
 def test():
-	import sys
-	if sys.argv[1:]: host = sys.argv[1]
-	else: host = ''
-	if sys.argv[2:]: filesys = sys.argv[2]
-	else: filesys = None
-	from mountclient import UDPMountClient, TCPMountClient
-	mcl = TCPMountClient(host)
-	if filesys == None:
-		list = mcl.Export()
-		for item in list:
-			print item
-		return
-	sf = mcl.Mnt(filesys)
-	print sf
-	fh = sf[1]
-	if fh:
-		ncl = NFSClient(host)
-		as = ncl.Getattr(fh)
-		print as
-		list = ncl.Listdir(fh)
-		for item in list: print item
-		mcl.Umnt(filesys)
+    import sys
+    if sys.argv[1:]: host = sys.argv[1]
+    else: host = ''
+    if sys.argv[2:]: filesys = sys.argv[2]
+    else: filesys = None
+    from mountclient import UDPMountClient, TCPMountClient
+    mcl = TCPMountClient(host)
+    if filesys == None:
+        list = mcl.Export()
+        for item in list:
+            print item
+        return
+    sf = mcl.Mnt(filesys)
+    print sf
+    fh = sf[1]
+    if fh:
+        ncl = NFSClient(host)
+        as = ncl.Getattr(fh)
+        print as
+        list = ncl.Listdir(fh)
+        for item in list: print item
+        mcl.Umnt(filesys)
diff --git a/Demo/rpc/rnusersclient.py b/Demo/rpc/rnusersclient.py
index 90cbd6d..1f3a882 100644
--- a/Demo/rpc/rnusersclient.py
+++ b/Demo/rpc/rnusersclient.py
@@ -5,94 +5,94 @@
 
 
 class RnusersPacker(Packer):
-	def pack_utmp(self, ui):
-		ut_line, ut_name, ut_host, ut_time = utmp
-		self.pack_string(ut_line)
-		self.pack_string(ut_name)
-		self.pack_string(ut_host)
-		self.pack_int(ut_time)
-	def pack_utmpidle(self, ui):
-		ui_itmp, ui_idle = ui
-		self.pack_utmp(ui_utmp)
-		self.pack_uint(ui_idle)
-	def pack_utmpidlearr(self, list):
-		self.pack_array(list, self.pack_itmpidle)
+    def pack_utmp(self, ui):
+        ut_line, ut_name, ut_host, ut_time = utmp
+        self.pack_string(ut_line)
+        self.pack_string(ut_name)
+        self.pack_string(ut_host)
+        self.pack_int(ut_time)
+    def pack_utmpidle(self, ui):
+        ui_itmp, ui_idle = ui
+        self.pack_utmp(ui_utmp)
+        self.pack_uint(ui_idle)
+    def pack_utmpidlearr(self, list):
+        self.pack_array(list, self.pack_itmpidle)
 
 
 class RnusersUnpacker(Unpacker):
-	def unpack_utmp(self):
-		ut_line = self.unpack_string()
-		ut_name = self.unpack_string()
-		ut_host = self.unpack_string()
-		ut_time = self.unpack_int()
-		return ut_line, ut_name, ut_host, ut_time
-	def unpack_utmpidle(self):
-		ui_utmp = self.unpack_utmp()
-		ui_idle = self.unpack_uint()
-		return ui_utmp, ui_idle
-	def unpack_utmpidlearr(self):
-		return self.unpack_array(self.unpack_utmpidle)
+    def unpack_utmp(self):
+        ut_line = self.unpack_string()
+        ut_name = self.unpack_string()
+        ut_host = self.unpack_string()
+        ut_time = self.unpack_int()
+        return ut_line, ut_name, ut_host, ut_time
+    def unpack_utmpidle(self):
+        ui_utmp = self.unpack_utmp()
+        ui_idle = self.unpack_uint()
+        return ui_utmp, ui_idle
+    def unpack_utmpidlearr(self):
+        return self.unpack_array(self.unpack_utmpidle)
 
 
 class PartialRnusersClient:
 
-	def addpackers(self):
-		self.packer = RnusersPacker()
-		self.unpacker = RnusersUnpacker('')
+    def addpackers(self):
+        self.packer = RnusersPacker()
+        self.unpacker = RnusersUnpacker('')
 
-	def Num(self):
-		return self.make_call(1, None, None, self.unpacker.unpack_int)
+    def Num(self):
+        return self.make_call(1, None, None, self.unpacker.unpack_int)
 
-	def Names(self):
-		return self.make_call(2, None, \
-			None, self.unpacker.unpack_utmpidlearr)
+    def Names(self):
+        return self.make_call(2, None, \
+                None, self.unpacker.unpack_utmpidlearr)
 
-	def Allnames(self):
-		return self.make_call(3, None, \
-			None, self.unpacker.unpack_utmpidlearr)
+    def Allnames(self):
+        return self.make_call(3, None, \
+                None, self.unpacker.unpack_utmpidlearr)
 
 
 class RnusersClient(PartialRnusersClient, UDPClient):
 
-	def __init__(self, host):
-		UDPClient.__init__(self, host, 100002, 2)
+    def __init__(self, host):
+        UDPClient.__init__(self, host, 100002, 2)
 
 
 class BroadcastRnusersClient(PartialRnusersClient, BroadcastUDPClient):
 
-	def __init__(self, bcastaddr):
-		BroadcastUDPClient.__init__(self, bcastaddr, 100002, 2)
+    def __init__(self, bcastaddr):
+        BroadcastUDPClient.__init__(self, bcastaddr, 100002, 2)
 
 
 def test():
-	import sys
-	if not sys.argv[1:]:
-		testbcast()
-		return
-	else:
-		host = sys.argv[1]
-	c = RnusersClient(host)
-	list = c.Names()
-	for (line, name, host, time), idle in list:
-		line = strip0(line)
-		name = strip0(name)
-		host = strip0(host)
-		print "%r %r %r %s %s" % (name, host, line, time, idle)
+    import sys
+    if not sys.argv[1:]:
+        testbcast()
+        return
+    else:
+        host = sys.argv[1]
+    c = RnusersClient(host)
+    list = c.Names()
+    for (line, name, host, time), idle in list:
+        line = strip0(line)
+        name = strip0(name)
+        host = strip0(host)
+        print "%r %r %r %s %s" % (name, host, line, time, idle)
 
 def testbcast():
-	c = BroadcastRnusersClient('<broadcast>')
-	def listit(list, fromaddr):
-		host, port = fromaddr
-		print host + '\t:',
-		for (line, name, host, time), idle in list:
-			print strip0(name),
-		print
-	c.set_reply_handler(listit)
-	all = c.Names()
-	print 'Total Count:', len(all)
+    c = BroadcastRnusersClient('<broadcast>')
+    def listit(list, fromaddr):
+        host, port = fromaddr
+        print host + '\t:',
+        for (line, name, host, time), idle in list:
+            print strip0(name),
+        print
+    c.set_reply_handler(listit)
+    all = c.Names()
+    print 'Total Count:', len(all)
 
 def strip0(s):
-	while s and s[-1] == '\0': s = s[:-1]
-	return s
+    while s and s[-1] == '\0': s = s[:-1]
+    return s
 
 test()
diff --git a/Demo/rpc/rpc.py b/Demo/rpc/rpc.py
index 6b15db4..452b47b 100644
--- a/Demo/rpc/rpc.py
+++ b/Demo/rpc/rpc.py
@@ -25,56 +25,56 @@
 MSG_ACCEPTED = 0
 MSG_DENIED = 1
 
-SUCCESS = 0				# RPC executed successfully
-PROG_UNAVAIL  = 1			# remote hasn't exported program
-PROG_MISMATCH = 2			# remote can't support version #
-PROC_UNAVAIL  = 3			# program can't support procedure
-GARBAGE_ARGS  = 4			# procedure can't decode params
+SUCCESS = 0                             # RPC executed successfully
+PROG_UNAVAIL  = 1                       # remote hasn't exported program
+PROG_MISMATCH = 2                       # remote can't support version #
+PROC_UNAVAIL  = 3                       # program can't support procedure
+GARBAGE_ARGS  = 4                       # procedure can't decode params
 
-RPC_MISMATCH = 0			# RPC version number != 2
-AUTH_ERROR = 1				# remote can't authenticate caller
+RPC_MISMATCH = 0                        # RPC version number != 2
+AUTH_ERROR = 1                          # remote can't authenticate caller
 
-AUTH_BADCRED      = 1			# bad credentials (seal broken)
-AUTH_REJECTEDCRED = 2			# client must begin new session
-AUTH_BADVERF      = 3			# bad verifier (seal broken)
-AUTH_REJECTEDVERF = 4			# verifier expired or replayed
-AUTH_TOOWEAK      = 5			# rejected for security reasons
+AUTH_BADCRED      = 1                   # bad credentials (seal broken)
+AUTH_REJECTEDCRED = 2                   # client must begin new session
+AUTH_BADVERF      = 3                   # bad verifier (seal broken)
+AUTH_REJECTEDVERF = 4                   # verifier expired or replayed
+AUTH_TOOWEAK      = 5                   # rejected for security reasons
 
 
 class Packer(xdr.Packer):
 
-	def pack_auth(self, auth):
-		flavor, stuff = auth
-		self.pack_enum(flavor)
-		self.pack_opaque(stuff)
+    def pack_auth(self, auth):
+        flavor, stuff = auth
+        self.pack_enum(flavor)
+        self.pack_opaque(stuff)
 
-	def pack_auth_unix(self, stamp, machinename, uid, gid, gids):
-		self.pack_uint(stamp)
-		self.pack_string(machinename)
-		self.pack_uint(uid)
-		self.pack_uint(gid)
-		self.pack_uint(len(gids))
-		for i in gids:
-			self.pack_uint(i)
+    def pack_auth_unix(self, stamp, machinename, uid, gid, gids):
+        self.pack_uint(stamp)
+        self.pack_string(machinename)
+        self.pack_uint(uid)
+        self.pack_uint(gid)
+        self.pack_uint(len(gids))
+        for i in gids:
+            self.pack_uint(i)
 
-	def pack_callheader(self, xid, prog, vers, proc, cred, verf):
-		self.pack_uint(xid)
-		self.pack_enum(CALL)
-		self.pack_uint(RPCVERSION)
-		self.pack_uint(prog)
-		self.pack_uint(vers)
-		self.pack_uint(proc)
-		self.pack_auth(cred)
-		self.pack_auth(verf)
-		# Caller must add procedure-specific part of call
+    def pack_callheader(self, xid, prog, vers, proc, cred, verf):
+        self.pack_uint(xid)
+        self.pack_enum(CALL)
+        self.pack_uint(RPCVERSION)
+        self.pack_uint(prog)
+        self.pack_uint(vers)
+        self.pack_uint(proc)
+        self.pack_auth(cred)
+        self.pack_auth(verf)
+        # Caller must add procedure-specific part of call
 
-	def pack_replyheader(self, xid, verf):
-		self.pack_uint(xid)
-		self.pack_enum(REPLY)
-		self.pack_uint(MSG_ACCEPTED)
-		self.pack_auth(verf)
-		self.pack_enum(SUCCESS)
-		# Caller must add procedure-specific part of reply
+    def pack_replyheader(self, xid, verf):
+        self.pack_uint(xid)
+        self.pack_enum(REPLY)
+        self.pack_uint(MSG_ACCEPTED)
+        self.pack_auth(verf)
+        self.pack_enum(SUCCESS)
+        # Caller must add procedure-specific part of reply
 
 
 # Exceptions
@@ -84,87 +84,87 @@
 
 class Unpacker(xdr.Unpacker):
 
-	def unpack_auth(self):
-		flavor = self.unpack_enum()
-		stuff = self.unpack_opaque()
-		return (flavor, stuff)
+    def unpack_auth(self):
+        flavor = self.unpack_enum()
+        stuff = self.unpack_opaque()
+        return (flavor, stuff)
 
-	def unpack_callheader(self):
-		xid = self.unpack_uint(xid)
-		temp = self.unpack_enum()
-		if temp <> CALL:
-			raise BadRPCFormat, 'no CALL but %r' % (temp,)
-		temp = self.unpack_uint()
-		if temp <> RPCVERSION:
-			raise BadRPCVerspion, 'bad RPC version %r' % (temp,)
-		prog = self.unpack_uint()
-		vers = self.unpack_uint()
-		proc = self.unpack_uint()
-		cred = self.unpack_auth()
-		verf = self.unpack_auth()
-		return xid, prog, vers, proc, cred, verf
-		# Caller must add procedure-specific part of call
+    def unpack_callheader(self):
+        xid = self.unpack_uint(xid)
+        temp = self.unpack_enum()
+        if temp <> CALL:
+            raise BadRPCFormat, 'no CALL but %r' % (temp,)
+        temp = self.unpack_uint()
+        if temp <> RPCVERSION:
+            raise BadRPCVerspion, 'bad RPC version %r' % (temp,)
+        prog = self.unpack_uint()
+        vers = self.unpack_uint()
+        proc = self.unpack_uint()
+        cred = self.unpack_auth()
+        verf = self.unpack_auth()
+        return xid, prog, vers, proc, cred, verf
+        # Caller must add procedure-specific part of call
 
-	def unpack_replyheader(self):
-		xid = self.unpack_uint()
-		mtype = self.unpack_enum()
-		if mtype <> REPLY:
-			raise RuntimeError, 'no REPLY but %r' % (mtype,)
-		stat = self.unpack_enum()
-		if stat == MSG_DENIED:
-			stat = self.unpack_enum()
-			if stat == RPC_MISMATCH:
-				low = self.unpack_uint()
-				high = self.unpack_uint()
-				raise RuntimeError, \
-				  'MSG_DENIED: RPC_MISMATCH: %r' % ((low, high),)
-			if stat == AUTH_ERROR:
-				stat = self.unpack_uint()
-				raise RuntimeError, \
-					'MSG_DENIED: AUTH_ERROR: %r' % (stat,)
-			raise RuntimeError, 'MSG_DENIED: %r' % (stat,)
-		if stat <> MSG_ACCEPTED:
-			raise RuntimeError, \
-			  'Neither MSG_DENIED nor MSG_ACCEPTED: %r' % (stat,)
-		verf = self.unpack_auth()
-		stat = self.unpack_enum()
-		if stat == PROG_UNAVAIL:
-			raise RuntimeError, 'call failed: PROG_UNAVAIL'
-		if stat == PROG_MISMATCH:
-			low = self.unpack_uint()
-			high = self.unpack_uint()
-			raise RuntimeError, \
-				'call failed: PROG_MISMATCH: %r' % ((low, high),)
-		if stat == PROC_UNAVAIL:
-			raise RuntimeError, 'call failed: PROC_UNAVAIL'
-		if stat == GARBAGE_ARGS:
-			raise RuntimeError, 'call failed: GARBAGE_ARGS'
-		if stat <> SUCCESS:
-			raise RuntimeError, 'call failed: %r' % (stat,)
-		return xid, verf
-		# Caller must get procedure-specific part of reply
+    def unpack_replyheader(self):
+        xid = self.unpack_uint()
+        mtype = self.unpack_enum()
+        if mtype <> REPLY:
+            raise RuntimeError, 'no REPLY but %r' % (mtype,)
+        stat = self.unpack_enum()
+        if stat == MSG_DENIED:
+            stat = self.unpack_enum()
+            if stat == RPC_MISMATCH:
+                low = self.unpack_uint()
+                high = self.unpack_uint()
+                raise RuntimeError, \
+                  'MSG_DENIED: RPC_MISMATCH: %r' % ((low, high),)
+            if stat == AUTH_ERROR:
+                stat = self.unpack_uint()
+                raise RuntimeError, \
+                        'MSG_DENIED: AUTH_ERROR: %r' % (stat,)
+            raise RuntimeError, 'MSG_DENIED: %r' % (stat,)
+        if stat <> MSG_ACCEPTED:
+            raise RuntimeError, \
+              'Neither MSG_DENIED nor MSG_ACCEPTED: %r' % (stat,)
+        verf = self.unpack_auth()
+        stat = self.unpack_enum()
+        if stat == PROG_UNAVAIL:
+            raise RuntimeError, 'call failed: PROG_UNAVAIL'
+        if stat == PROG_MISMATCH:
+            low = self.unpack_uint()
+            high = self.unpack_uint()
+            raise RuntimeError, \
+                    'call failed: PROG_MISMATCH: %r' % ((low, high),)
+        if stat == PROC_UNAVAIL:
+            raise RuntimeError, 'call failed: PROC_UNAVAIL'
+        if stat == GARBAGE_ARGS:
+            raise RuntimeError, 'call failed: GARBAGE_ARGS'
+        if stat <> SUCCESS:
+            raise RuntimeError, 'call failed: %r' % (stat,)
+        return xid, verf
+        # Caller must get procedure-specific part of reply
 
 
 # Subroutines to create opaque authentication objects
 
 def make_auth_null():
-	return ''
+    return ''
 
 def make_auth_unix(seed, host, uid, gid, groups):
-	p = Packer()
-	p.pack_auth_unix(seed, host, uid, gid, groups)
-	return p.get_buf()
+    p = Packer()
+    p.pack_auth_unix(seed, host, uid, gid, groups)
+    return p.get_buf()
 
 def make_auth_unix_default():
-	try:
-		from os import getuid, getgid
-		uid = getuid()
-		gid = getgid()
-	except ImportError:
-		uid = gid = 0
-	import time
-	return make_auth_unix(int(time.time()-unix_epoch()), \
-		  socket.gethostname(), uid, gid, [])
+    try:
+        from os import getuid, getgid
+        uid = getuid()
+        gid = getgid()
+    except ImportError:
+        uid = gid = 0
+    import time
+    return make_auth_unix(int(time.time()-unix_epoch()), \
+              socket.gethostname(), uid, gid, [])
 
 _unix_epoch = -1
 def unix_epoch():
@@ -182,7 +182,7 @@
     if _unix_epoch >= 0: return _unix_epoch
     import time
     now = time.time()
-    localt = time.localtime(now)	# (y, m, d, hh, mm, ss, ..., ..., ...)
+    localt = time.localtime(now)        # (y, m, d, hh, mm, ss, ..., ..., ...)
     gmt = time.gmtime(now)
     offset = time.mktime(localt) - time.mktime(gmt)
     y, m, d, hh, mm, ss = 1970, 1, 1, 0, 0, 0
@@ -199,259 +199,259 @@
 
 class Client:
 
-	def __init__(self, host, prog, vers, port):
-		self.host = host
-		self.prog = prog
-		self.vers = vers
-		self.port = port
-		self.makesocket() # Assigns to self.sock
-		self.bindsocket()
-		self.connsocket()
-		self.lastxid = 0 # XXX should be more random?
-		self.addpackers()
-		self.cred = None
-		self.verf = None
+    def __init__(self, host, prog, vers, port):
+        self.host = host
+        self.prog = prog
+        self.vers = vers
+        self.port = port
+        self.makesocket() # Assigns to self.sock
+        self.bindsocket()
+        self.connsocket()
+        self.lastxid = 0 # XXX should be more random?
+        self.addpackers()
+        self.cred = None
+        self.verf = None
 
-	def close(self):
-		self.sock.close()
+    def close(self):
+        self.sock.close()
 
-	def makesocket(self):
-		# This MUST be overridden
-		raise RuntimeError, 'makesocket not defined'
+    def makesocket(self):
+        # This MUST be overridden
+        raise RuntimeError, 'makesocket not defined'
 
-	def connsocket(self):
-		# Override this if you don't want/need a connection
-		self.sock.connect((self.host, self.port))
+    def connsocket(self):
+        # Override this if you don't want/need a connection
+        self.sock.connect((self.host, self.port))
 
-	def bindsocket(self):
-		# Override this to bind to a different port (e.g. reserved)
-		self.sock.bind(('', 0))
+    def bindsocket(self):
+        # Override this to bind to a different port (e.g. reserved)
+        self.sock.bind(('', 0))
 
-	def addpackers(self):
-		# Override this to use derived classes from Packer/Unpacker
-		self.packer = Packer()
-		self.unpacker = Unpacker('')
+    def addpackers(self):
+        # Override this to use derived classes from Packer/Unpacker
+        self.packer = Packer()
+        self.unpacker = Unpacker('')
 
-	def make_call(self, proc, args, pack_func, unpack_func):
-		# Don't normally override this (but see Broadcast)
-		if pack_func is None and args is not None:
-			raise TypeError, 'non-null args with null pack_func'
-		self.start_call(proc)
-		if pack_func:
-			pack_func(args)
-		self.do_call()
-		if unpack_func:
-			result = unpack_func()
-		else:
-			result = None
-		self.unpacker.done()
-		return result
+    def make_call(self, proc, args, pack_func, unpack_func):
+        # Don't normally override this (but see Broadcast)
+        if pack_func is None and args is not None:
+            raise TypeError, 'non-null args with null pack_func'
+        self.start_call(proc)
+        if pack_func:
+            pack_func(args)
+        self.do_call()
+        if unpack_func:
+            result = unpack_func()
+        else:
+            result = None
+        self.unpacker.done()
+        return result
 
-	def start_call(self, proc):
-		# Don't override this
-		self.lastxid = xid = self.lastxid + 1
-		cred = self.mkcred()
-		verf = self.mkverf()
-		p = self.packer
-		p.reset()
-		p.pack_callheader(xid, self.prog, self.vers, proc, cred, verf)
+    def start_call(self, proc):
+        # Don't override this
+        self.lastxid = xid = self.lastxid + 1
+        cred = self.mkcred()
+        verf = self.mkverf()
+        p = self.packer
+        p.reset()
+        p.pack_callheader(xid, self.prog, self.vers, proc, cred, verf)
 
-	def do_call(self):
-		# This MUST be overridden
-		raise RuntimeError, 'do_call not defined'
+    def do_call(self):
+        # This MUST be overridden
+        raise RuntimeError, 'do_call not defined'
 
-	def mkcred(self):
-		# Override this to use more powerful credentials
-		if self.cred == None:
-			self.cred = (AUTH_NULL, make_auth_null())
-		return self.cred
+    def mkcred(self):
+        # Override this to use more powerful credentials
+        if self.cred == None:
+            self.cred = (AUTH_NULL, make_auth_null())
+        return self.cred
 
-	def mkverf(self):
-		# Override this to use a more powerful verifier
-		if self.verf == None:
-			self.verf = (AUTH_NULL, make_auth_null())
-		return self.verf
+    def mkverf(self):
+        # Override this to use a more powerful verifier
+        if self.verf == None:
+            self.verf = (AUTH_NULL, make_auth_null())
+        return self.verf
 
-	def call_0(self):		# Procedure 0 is always like this
-		return self.make_call(0, None, None, None)
+    def call_0(self):               # Procedure 0 is always like this
+        return self.make_call(0, None, None, None)
 
 
 # Record-Marking standard support
 
 def sendfrag(sock, last, frag):
-	x = len(frag)
-	if last: x = x | 0x80000000L
-	header = (chr(int(x>>24 & 0xff)) + chr(int(x>>16 & 0xff)) + \
-		  chr(int(x>>8 & 0xff)) + chr(int(x & 0xff)))
-	sock.send(header + frag)
+    x = len(frag)
+    if last: x = x | 0x80000000L
+    header = (chr(int(x>>24 & 0xff)) + chr(int(x>>16 & 0xff)) + \
+              chr(int(x>>8 & 0xff)) + chr(int(x & 0xff)))
+    sock.send(header + frag)
 
 def sendrecord(sock, record):
-	sendfrag(sock, 1, record)
+    sendfrag(sock, 1, record)
 
 def recvfrag(sock):
-	header = sock.recv(4)
-	if len(header) < 4:
-		raise EOFError
-	x = long(ord(header[0]))<<24 | ord(header[1])<<16 | \
-	    ord(header[2])<<8 | ord(header[3])
-	last = ((x & 0x80000000) != 0)
-	n = int(x & 0x7fffffff)
-	frag = ''
-	while n > 0:
-		buf = sock.recv(n)
-		if not buf: raise EOFError
-		n = n - len(buf)
-		frag = frag + buf
-	return last, frag
+    header = sock.recv(4)
+    if len(header) < 4:
+        raise EOFError
+    x = long(ord(header[0]))<<24 | ord(header[1])<<16 | \
+        ord(header[2])<<8 | ord(header[3])
+    last = ((x & 0x80000000) != 0)
+    n = int(x & 0x7fffffff)
+    frag = ''
+    while n > 0:
+        buf = sock.recv(n)
+        if not buf: raise EOFError
+        n = n - len(buf)
+        frag = frag + buf
+    return last, frag
 
 def recvrecord(sock):
-	record = ''
-	last = 0
-	while not last:
-		last, frag = recvfrag(sock)
-		record = record + frag
-	return record
+    record = ''
+    last = 0
+    while not last:
+        last, frag = recvfrag(sock)
+        record = record + frag
+    return record
 
 
 # Try to bind to a reserved port (must be root)
 
 last_resv_port_tried = None
 def bindresvport(sock, host):
-	global last_resv_port_tried
-	FIRST, LAST = 600, 1024 # Range of ports to try
-	if last_resv_port_tried == None:
-		import os
-		last_resv_port_tried = FIRST + os.getpid() % (LAST-FIRST)
-	for i in range(last_resv_port_tried, LAST) + \
-		  range(FIRST, last_resv_port_tried):
-		last_resv_port_tried = i
-		try:
-			sock.bind((host, i))
-			return last_resv_port_tried
-		except socket.error, (errno, msg):
-			if errno <> 114:
-				raise socket.error, (errno, msg)
-	raise RuntimeError, 'can\'t assign reserved port'
+    global last_resv_port_tried
+    FIRST, LAST = 600, 1024 # Range of ports to try
+    if last_resv_port_tried == None:
+        import os
+        last_resv_port_tried = FIRST + os.getpid() % (LAST-FIRST)
+    for i in range(last_resv_port_tried, LAST) + \
+              range(FIRST, last_resv_port_tried):
+        last_resv_port_tried = i
+        try:
+            sock.bind((host, i))
+            return last_resv_port_tried
+        except socket.error, (errno, msg):
+            if errno <> 114:
+                raise socket.error, (errno, msg)
+    raise RuntimeError, 'can\'t assign reserved port'
 
 
 # Client using TCP to a specific port
 
 class RawTCPClient(Client):
 
-	def makesocket(self):
-		self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    def makesocket(self):
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
-	def do_call(self):
-		call = self.packer.get_buf()
-		sendrecord(self.sock, call)
-		reply = recvrecord(self.sock)
-		u = self.unpacker
-		u.reset(reply)
-		xid, verf = u.unpack_replyheader()
-		if xid <> self.lastxid:
-			# Can't really happen since this is TCP...
-			raise RuntimeError, 'wrong xid in reply %r instead of %r' % (
-			                     xid, self.lastxid)
+    def do_call(self):
+        call = self.packer.get_buf()
+        sendrecord(self.sock, call)
+        reply = recvrecord(self.sock)
+        u = self.unpacker
+        u.reset(reply)
+        xid, verf = u.unpack_replyheader()
+        if xid <> self.lastxid:
+            # Can't really happen since this is TCP...
+            raise RuntimeError, 'wrong xid in reply %r instead of %r' % (
+                                 xid, self.lastxid)
 
 
 # Client using UDP to a specific port
 
 class RawUDPClient(Client):
 
-	def makesocket(self):
-		self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    def makesocket(self):
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 
-	def do_call(self):
-		call = self.packer.get_buf()
-		self.sock.send(call)
-		try:
-			from select import select
-		except ImportError:
-			print 'WARNING: select not found, RPC may hang'
-			select = None
-		BUFSIZE = 8192 # Max UDP buffer size
-		timeout = 1
-		count = 5
-		while 1:
-			r, w, x = [self.sock], [], []
-			if select:
-				r, w, x = select(r, w, x, timeout)
-			if self.sock not in r:
-				count = count - 1
-				if count < 0: raise RuntimeError, 'timeout'
-				if timeout < 25: timeout = timeout *2
-##				print 'RESEND', timeout, count
-				self.sock.send(call)
-				continue
-			reply = self.sock.recv(BUFSIZE)
-			u = self.unpacker
-			u.reset(reply)
-			xid, verf = u.unpack_replyheader()
-			if xid <> self.lastxid:
-##				print 'BAD xid'
-				continue
-			break
+    def do_call(self):
+        call = self.packer.get_buf()
+        self.sock.send(call)
+        try:
+            from select import select
+        except ImportError:
+            print 'WARNING: select not found, RPC may hang'
+            select = None
+        BUFSIZE = 8192 # Max UDP buffer size
+        timeout = 1
+        count = 5
+        while 1:
+            r, w, x = [self.sock], [], []
+            if select:
+                r, w, x = select(r, w, x, timeout)
+            if self.sock not in r:
+                count = count - 1
+                if count < 0: raise RuntimeError, 'timeout'
+                if timeout < 25: timeout = timeout *2
+##                              print 'RESEND', timeout, count
+                self.sock.send(call)
+                continue
+            reply = self.sock.recv(BUFSIZE)
+            u = self.unpacker
+            u.reset(reply)
+            xid, verf = u.unpack_replyheader()
+            if xid <> self.lastxid:
+##                              print 'BAD xid'
+                continue
+            break
 
 
 # Client using UDP broadcast to a specific port
 
 class RawBroadcastUDPClient(RawUDPClient):
 
-	def __init__(self, bcastaddr, prog, vers, port):
-		RawUDPClient.__init__(self, bcastaddr, prog, vers, port)
-		self.reply_handler = None
-		self.timeout = 30
+    def __init__(self, bcastaddr, prog, vers, port):
+        RawUDPClient.__init__(self, bcastaddr, prog, vers, port)
+        self.reply_handler = None
+        self.timeout = 30
 
-	def connsocket(self):
-		# Don't connect -- use sendto
-		self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
+    def connsocket(self):
+        # Don't connect -- use sendto
+        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
 
-	def set_reply_handler(self, reply_handler):
-		self.reply_handler = reply_handler
+    def set_reply_handler(self, reply_handler):
+        self.reply_handler = reply_handler
 
-	def set_timeout(self, timeout):
-		self.timeout = timeout # Use None for infinite timeout
+    def set_timeout(self, timeout):
+        self.timeout = timeout # Use None for infinite timeout
 
-	def make_call(self, proc, args, pack_func, unpack_func):
-		if pack_func is None and args is not None:
-			raise TypeError, 'non-null args with null pack_func'
-		self.start_call(proc)
-		if pack_func:
-			pack_func(args)
-		call = self.packer.get_buf()
-		self.sock.sendto(call, (self.host, self.port))
-		try:
-			from select import select
-		except ImportError:
-			print 'WARNING: select not found, broadcast will hang'
-			select = None
-		BUFSIZE = 8192 # Max UDP buffer size (for reply)
-		replies = []
-		if unpack_func is None:
-			def dummy(): pass
-			unpack_func = dummy
-		while 1:
-			r, w, x = [self.sock], [], []
-			if select:
-				if self.timeout is None:
-					r, w, x = select(r, w, x)
-				else:
-					r, w, x = select(r, w, x, self.timeout)
-			if self.sock not in r:
-				break
-			reply, fromaddr = self.sock.recvfrom(BUFSIZE)
-			u = self.unpacker
-			u.reset(reply)
-			xid, verf = u.unpack_replyheader()
-			if xid <> self.lastxid:
-##				print 'BAD xid'
-				continue
-			reply = unpack_func()
-			self.unpacker.done()
-			replies.append((reply, fromaddr))
-			if self.reply_handler:
-				self.reply_handler(reply, fromaddr)
-		return replies
+    def make_call(self, proc, args, pack_func, unpack_func):
+        if pack_func is None and args is not None:
+            raise TypeError, 'non-null args with null pack_func'
+        self.start_call(proc)
+        if pack_func:
+            pack_func(args)
+        call = self.packer.get_buf()
+        self.sock.sendto(call, (self.host, self.port))
+        try:
+            from select import select
+        except ImportError:
+            print 'WARNING: select not found, broadcast will hang'
+            select = None
+        BUFSIZE = 8192 # Max UDP buffer size (for reply)
+        replies = []
+        if unpack_func is None:
+            def dummy(): pass
+            unpack_func = dummy
+        while 1:
+            r, w, x = [self.sock], [], []
+            if select:
+                if self.timeout is None:
+                    r, w, x = select(r, w, x)
+                else:
+                    r, w, x = select(r, w, x, self.timeout)
+            if self.sock not in r:
+                break
+            reply, fromaddr = self.sock.recvfrom(BUFSIZE)
+            u = self.unpacker
+            u.reset(reply)
+            xid, verf = u.unpack_replyheader()
+            if xid <> self.lastxid:
+##                              print 'BAD xid'
+                continue
+            reply = unpack_func()
+            self.unpacker.done()
+            replies.append((reply, fromaddr))
+            if self.reply_handler:
+                self.reply_handler(reply, fromaddr)
+        return replies
 
 
 # Port mapper interface
@@ -462,12 +462,12 @@
 PMAP_PORT = 111
 
 # Procedure numbers
-PMAPPROC_NULL = 0			# (void) -> void
-PMAPPROC_SET = 1			# (mapping) -> bool
-PMAPPROC_UNSET = 2			# (mapping) -> bool
-PMAPPROC_GETPORT = 3			# (mapping) -> unsigned int
-PMAPPROC_DUMP = 4			# (void) -> pmaplist
-PMAPPROC_CALLIT = 5			# (call_args) -> call_result
+PMAPPROC_NULL = 0                       # (void) -> void
+PMAPPROC_SET = 1                        # (mapping) -> bool
+PMAPPROC_UNSET = 2                      # (mapping) -> bool
+PMAPPROC_GETPORT = 3                    # (mapping) -> unsigned int
+PMAPPROC_DUMP = 4                       # (void) -> pmaplist
+PMAPPROC_CALLIT = 5                     # (call_args) -> call_result
 
 # A mapping is (prog, vers, prot, port) and prot is one of:
 
@@ -483,162 +483,162 @@
 
 class PortMapperPacker(Packer):
 
-	def pack_mapping(self, mapping):
-		prog, vers, prot, port = mapping
-		self.pack_uint(prog)
-		self.pack_uint(vers)
-		self.pack_uint(prot)
-		self.pack_uint(port)
+    def pack_mapping(self, mapping):
+        prog, vers, prot, port = mapping
+        self.pack_uint(prog)
+        self.pack_uint(vers)
+        self.pack_uint(prot)
+        self.pack_uint(port)
 
-	def pack_pmaplist(self, list):
-		self.pack_list(list, self.pack_mapping)
+    def pack_pmaplist(self, list):
+        self.pack_list(list, self.pack_mapping)
 
-	def pack_call_args(self, ca):
-		prog, vers, proc, args = ca
-		self.pack_uint(prog)
-		self.pack_uint(vers)
-		self.pack_uint(proc)
-		self.pack_opaque(args)
+    def pack_call_args(self, ca):
+        prog, vers, proc, args = ca
+        self.pack_uint(prog)
+        self.pack_uint(vers)
+        self.pack_uint(proc)
+        self.pack_opaque(args)
 
 
 class PortMapperUnpacker(Unpacker):
 
-	def unpack_mapping(self):
-		prog = self.unpack_uint()
-		vers = self.unpack_uint()
-		prot = self.unpack_uint()
-		port = self.unpack_uint()
-		return prog, vers, prot, port
+    def unpack_mapping(self):
+        prog = self.unpack_uint()
+        vers = self.unpack_uint()
+        prot = self.unpack_uint()
+        port = self.unpack_uint()
+        return prog, vers, prot, port
 
-	def unpack_pmaplist(self):
-		return self.unpack_list(self.unpack_mapping)
+    def unpack_pmaplist(self):
+        return self.unpack_list(self.unpack_mapping)
 
-	def unpack_call_result(self):
-		port = self.unpack_uint()
-		res = self.unpack_opaque()
-		return port, res
+    def unpack_call_result(self):
+        port = self.unpack_uint()
+        res = self.unpack_opaque()
+        return port, res
 
 
 class PartialPortMapperClient:
 
-	def addpackers(self):
-		self.packer = PortMapperPacker()
-		self.unpacker = PortMapperUnpacker('')
+    def addpackers(self):
+        self.packer = PortMapperPacker()
+        self.unpacker = PortMapperUnpacker('')
 
-	def Set(self, mapping):
-		return self.make_call(PMAPPROC_SET, mapping, \
-			self.packer.pack_mapping, \
-			self.unpacker.unpack_uint)
+    def Set(self, mapping):
+        return self.make_call(PMAPPROC_SET, mapping, \
+                self.packer.pack_mapping, \
+                self.unpacker.unpack_uint)
 
-	def Unset(self, mapping):
-		return self.make_call(PMAPPROC_UNSET, mapping, \
-			self.packer.pack_mapping, \
-			self.unpacker.unpack_uint)
+    def Unset(self, mapping):
+        return self.make_call(PMAPPROC_UNSET, mapping, \
+                self.packer.pack_mapping, \
+                self.unpacker.unpack_uint)
 
-	def Getport(self, mapping):
-		return self.make_call(PMAPPROC_GETPORT, mapping, \
-			self.packer.pack_mapping, \
-			self.unpacker.unpack_uint)
+    def Getport(self, mapping):
+        return self.make_call(PMAPPROC_GETPORT, mapping, \
+                self.packer.pack_mapping, \
+                self.unpacker.unpack_uint)
 
-	def Dump(self):
-		return self.make_call(PMAPPROC_DUMP, None, \
-			None, \
-			self.unpacker.unpack_pmaplist)
+    def Dump(self):
+        return self.make_call(PMAPPROC_DUMP, None, \
+                None, \
+                self.unpacker.unpack_pmaplist)
 
-	def Callit(self, ca):
-		return self.make_call(PMAPPROC_CALLIT, ca, \
-			self.packer.pack_call_args, \
-			self.unpacker.unpack_call_result)
+    def Callit(self, ca):
+        return self.make_call(PMAPPROC_CALLIT, ca, \
+                self.packer.pack_call_args, \
+                self.unpacker.unpack_call_result)
 
 
 class TCPPortMapperClient(PartialPortMapperClient, RawTCPClient):
 
-	def __init__(self, host):
-		RawTCPClient.__init__(self, \
-			host, PMAP_PROG, PMAP_VERS, PMAP_PORT)
+    def __init__(self, host):
+        RawTCPClient.__init__(self, \
+                host, PMAP_PROG, PMAP_VERS, PMAP_PORT)
 
 
 class UDPPortMapperClient(PartialPortMapperClient, RawUDPClient):
 
-	def __init__(self, host):
-		RawUDPClient.__init__(self, \
-			host, PMAP_PROG, PMAP_VERS, PMAP_PORT)
+    def __init__(self, host):
+        RawUDPClient.__init__(self, \
+                host, PMAP_PROG, PMAP_VERS, PMAP_PORT)
 
 
 class BroadcastUDPPortMapperClient(PartialPortMapperClient, \
-				   RawBroadcastUDPClient):
+                                   RawBroadcastUDPClient):
 
-	def __init__(self, bcastaddr):
-		RawBroadcastUDPClient.__init__(self, \
-			bcastaddr, PMAP_PROG, PMAP_VERS, PMAP_PORT)
+    def __init__(self, bcastaddr):
+        RawBroadcastUDPClient.__init__(self, \
+                bcastaddr, PMAP_PROG, PMAP_VERS, PMAP_PORT)
 
 
 # Generic clients that find their server through the Port mapper
 
 class TCPClient(RawTCPClient):
 
-	def __init__(self, host, prog, vers):
-		pmap = TCPPortMapperClient(host)
-		port = pmap.Getport((prog, vers, IPPROTO_TCP, 0))
-		pmap.close()
-		if port == 0:
-			raise RuntimeError, 'program not registered'
-		RawTCPClient.__init__(self, host, prog, vers, port)
+    def __init__(self, host, prog, vers):
+        pmap = TCPPortMapperClient(host)
+        port = pmap.Getport((prog, vers, IPPROTO_TCP, 0))
+        pmap.close()
+        if port == 0:
+            raise RuntimeError, 'program not registered'
+        RawTCPClient.__init__(self, host, prog, vers, port)
 
 
 class UDPClient(RawUDPClient):
 
-	def __init__(self, host, prog, vers):
-		pmap = UDPPortMapperClient(host)
-		port = pmap.Getport((prog, vers, IPPROTO_UDP, 0))
-		pmap.close()
-		if port == 0:
-			raise RuntimeError, 'program not registered'
-		RawUDPClient.__init__(self, host, prog, vers, port)
+    def __init__(self, host, prog, vers):
+        pmap = UDPPortMapperClient(host)
+        port = pmap.Getport((prog, vers, IPPROTO_UDP, 0))
+        pmap.close()
+        if port == 0:
+            raise RuntimeError, 'program not registered'
+        RawUDPClient.__init__(self, host, prog, vers, port)
 
 
 class BroadcastUDPClient(Client):
 
-	def __init__(self, bcastaddr, prog, vers):
-		self.pmap = BroadcastUDPPortMapperClient(bcastaddr)
-		self.pmap.set_reply_handler(self.my_reply_handler)
-		self.prog = prog
-		self.vers = vers
-		self.user_reply_handler = None
-		self.addpackers()
+    def __init__(self, bcastaddr, prog, vers):
+        self.pmap = BroadcastUDPPortMapperClient(bcastaddr)
+        self.pmap.set_reply_handler(self.my_reply_handler)
+        self.prog = prog
+        self.vers = vers
+        self.user_reply_handler = None
+        self.addpackers()
 
-	def close(self):
-		self.pmap.close()
+    def close(self):
+        self.pmap.close()
 
-	def set_reply_handler(self, reply_handler):
-		self.user_reply_handler = reply_handler
+    def set_reply_handler(self, reply_handler):
+        self.user_reply_handler = reply_handler
 
-	def set_timeout(self, timeout):
-		self.pmap.set_timeout(timeout)
+    def set_timeout(self, timeout):
+        self.pmap.set_timeout(timeout)
 
-	def my_reply_handler(self, reply, fromaddr):
-		port, res = reply
-		self.unpacker.reset(res)
-		result = self.unpack_func()
-		self.unpacker.done()
-		self.replies.append((result, fromaddr))
-		if self.user_reply_handler is not None:
-			self.user_reply_handler(result, fromaddr)
+    def my_reply_handler(self, reply, fromaddr):
+        port, res = reply
+        self.unpacker.reset(res)
+        result = self.unpack_func()
+        self.unpacker.done()
+        self.replies.append((result, fromaddr))
+        if self.user_reply_handler is not None:
+            self.user_reply_handler(result, fromaddr)
 
-	def make_call(self, proc, args, pack_func, unpack_func):
-		self.packer.reset()
-		if pack_func:
-			pack_func(args)
-		if unpack_func is None:
-			def dummy(): pass
-			self.unpack_func = dummy
-		else:
-			self.unpack_func = unpack_func
-		self.replies = []
-		packed_args = self.packer.get_buf()
-		dummy_replies = self.pmap.Callit( \
-			(self.prog, self.vers, proc, packed_args))
-		return self.replies
+    def make_call(self, proc, args, pack_func, unpack_func):
+        self.packer.reset()
+        if pack_func:
+            pack_func(args)
+        if unpack_func is None:
+            def dummy(): pass
+            self.unpack_func = dummy
+        else:
+            self.unpack_func = unpack_func
+        self.replies = []
+        packed_args = self.packer.get_buf()
+        dummy_replies = self.pmap.Callit( \
+                (self.prog, self.vers, proc, packed_args))
+        return self.replies
 
 
 # Server classes
@@ -648,203 +648,203 @@
 
 class Server:
 
-	def __init__(self, host, prog, vers, port):
-		self.host = host # Should normally be '' for default interface
-		self.prog = prog
-		self.vers = vers
-		self.port = port # Should normally be 0 for random port
-		self.makesocket() # Assigns to self.sock and self.prot
-		self.bindsocket()
-		self.host, self.port = self.sock.getsockname()
-		self.addpackers()
+    def __init__(self, host, prog, vers, port):
+        self.host = host # Should normally be '' for default interface
+        self.prog = prog
+        self.vers = vers
+        self.port = port # Should normally be 0 for random port
+        self.makesocket() # Assigns to self.sock and self.prot
+        self.bindsocket()
+        self.host, self.port = self.sock.getsockname()
+        self.addpackers()
 
-	def register(self):
-		mapping = self.prog, self.vers, self.prot, self.port
-		p = TCPPortMapperClient(self.host)
-		if not p.Set(mapping):
-			raise RuntimeError, 'register failed'
+    def register(self):
+        mapping = self.prog, self.vers, self.prot, self.port
+        p = TCPPortMapperClient(self.host)
+        if not p.Set(mapping):
+            raise RuntimeError, 'register failed'
 
-	def unregister(self):
-		mapping = self.prog, self.vers, self.prot, self.port
-		p = TCPPortMapperClient(self.host)
-		if not p.Unset(mapping):
-			raise RuntimeError, 'unregister failed'
+    def unregister(self):
+        mapping = self.prog, self.vers, self.prot, self.port
+        p = TCPPortMapperClient(self.host)
+        if not p.Unset(mapping):
+            raise RuntimeError, 'unregister failed'
 
-	def handle(self, call):
-		# Don't use unpack_header but parse the header piecewise
-		# XXX I have no idea if I am using the right error responses!
-		self.unpacker.reset(call)
-		self.packer.reset()
-		xid = self.unpacker.unpack_uint()
-		self.packer.pack_uint(xid)
-		temp = self.unpacker.unpack_enum()
-		if temp <> CALL:
-			return None # Not worthy of a reply
-		self.packer.pack_uint(REPLY)
-		temp = self.unpacker.unpack_uint()
-		if temp <> RPCVERSION:
-			self.packer.pack_uint(MSG_DENIED)
-			self.packer.pack_uint(RPC_MISMATCH)
-			self.packer.pack_uint(RPCVERSION)
-			self.packer.pack_uint(RPCVERSION)
-			return self.packer.get_buf()
-		self.packer.pack_uint(MSG_ACCEPTED)
-		self.packer.pack_auth((AUTH_NULL, make_auth_null()))
-		prog = self.unpacker.unpack_uint()
-		if prog <> self.prog:
-			self.packer.pack_uint(PROG_UNAVAIL)
-			return self.packer.get_buf()
-		vers = self.unpacker.unpack_uint()
-		if vers <> self.vers:
-			self.packer.pack_uint(PROG_MISMATCH)
-			self.packer.pack_uint(self.vers)
-			self.packer.pack_uint(self.vers)
-			return self.packer.get_buf()
-		proc = self.unpacker.unpack_uint()
-		methname = 'handle_' + repr(proc)
-		try:
-			meth = getattr(self, methname)
-		except AttributeError:
-			self.packer.pack_uint(PROC_UNAVAIL)
-			return self.packer.get_buf()
-		cred = self.unpacker.unpack_auth()
-		verf = self.unpacker.unpack_auth()
-		try:
-			meth() # Unpack args, call turn_around(), pack reply
-		except (EOFError, GarbageArgs):
-			# Too few or too many arguments
-			self.packer.reset()
-			self.packer.pack_uint(xid)
-			self.packer.pack_uint(REPLY)
-			self.packer.pack_uint(MSG_ACCEPTED)
-			self.packer.pack_auth((AUTH_NULL, make_auth_null()))
-			self.packer.pack_uint(GARBAGE_ARGS)
-		return self.packer.get_buf()
+    def handle(self, call):
+        # Don't use unpack_header but parse the header piecewise
+        # XXX I have no idea if I am using the right error responses!
+        self.unpacker.reset(call)
+        self.packer.reset()
+        xid = self.unpacker.unpack_uint()
+        self.packer.pack_uint(xid)
+        temp = self.unpacker.unpack_enum()
+        if temp <> CALL:
+            return None # Not worthy of a reply
+        self.packer.pack_uint(REPLY)
+        temp = self.unpacker.unpack_uint()
+        if temp <> RPCVERSION:
+            self.packer.pack_uint(MSG_DENIED)
+            self.packer.pack_uint(RPC_MISMATCH)
+            self.packer.pack_uint(RPCVERSION)
+            self.packer.pack_uint(RPCVERSION)
+            return self.packer.get_buf()
+        self.packer.pack_uint(MSG_ACCEPTED)
+        self.packer.pack_auth((AUTH_NULL, make_auth_null()))
+        prog = self.unpacker.unpack_uint()
+        if prog <> self.prog:
+            self.packer.pack_uint(PROG_UNAVAIL)
+            return self.packer.get_buf()
+        vers = self.unpacker.unpack_uint()
+        if vers <> self.vers:
+            self.packer.pack_uint(PROG_MISMATCH)
+            self.packer.pack_uint(self.vers)
+            self.packer.pack_uint(self.vers)
+            return self.packer.get_buf()
+        proc = self.unpacker.unpack_uint()
+        methname = 'handle_' + repr(proc)
+        try:
+            meth = getattr(self, methname)
+        except AttributeError:
+            self.packer.pack_uint(PROC_UNAVAIL)
+            return self.packer.get_buf()
+        cred = self.unpacker.unpack_auth()
+        verf = self.unpacker.unpack_auth()
+        try:
+            meth() # Unpack args, call turn_around(), pack reply
+        except (EOFError, GarbageArgs):
+            # Too few or too many arguments
+            self.packer.reset()
+            self.packer.pack_uint(xid)
+            self.packer.pack_uint(REPLY)
+            self.packer.pack_uint(MSG_ACCEPTED)
+            self.packer.pack_auth((AUTH_NULL, make_auth_null()))
+            self.packer.pack_uint(GARBAGE_ARGS)
+        return self.packer.get_buf()
 
-	def turn_around(self):
-		try:
-			self.unpacker.done()
-		except RuntimeError:
-			raise GarbageArgs
-		self.packer.pack_uint(SUCCESS)
+    def turn_around(self):
+        try:
+            self.unpacker.done()
+        except RuntimeError:
+            raise GarbageArgs
+        self.packer.pack_uint(SUCCESS)
 
-	def handle_0(self): # Handle NULL message
-		self.turn_around()
+    def handle_0(self): # Handle NULL message
+        self.turn_around()
 
-	def makesocket(self):
-		# This MUST be overridden
-		raise RuntimeError, 'makesocket not defined'
+    def makesocket(self):
+        # This MUST be overridden
+        raise RuntimeError, 'makesocket not defined'
 
-	def bindsocket(self):
-		# Override this to bind to a different port (e.g. reserved)
-		self.sock.bind((self.host, self.port))
+    def bindsocket(self):
+        # Override this to bind to a different port (e.g. reserved)
+        self.sock.bind((self.host, self.port))
 
-	def addpackers(self):
-		# Override this to use derived classes from Packer/Unpacker
-		self.packer = Packer()
-		self.unpacker = Unpacker('')
+    def addpackers(self):
+        # Override this to use derived classes from Packer/Unpacker
+        self.packer = Packer()
+        self.unpacker = Unpacker('')
 
 
 class TCPServer(Server):
 
-	def makesocket(self):
-		self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-		self.prot = IPPROTO_TCP
+    def makesocket(self):
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self.prot = IPPROTO_TCP
 
-	def loop(self):
-		self.sock.listen(0)
-		while 1:
-			self.session(self.sock.accept())
+    def loop(self):
+        self.sock.listen(0)
+        while 1:
+            self.session(self.sock.accept())
 
-	def session(self, connection):
-		sock, (host, port) = connection
-		while 1:
-			try:
-				call = recvrecord(sock)
-			except EOFError:
-				break
-			except socket.error, msg:
-				print 'socket error:', msg
-				break
-			reply = self.handle(call)
-			if reply is not None:
-				sendrecord(sock, reply)
+    def session(self, connection):
+        sock, (host, port) = connection
+        while 1:
+            try:
+                call = recvrecord(sock)
+            except EOFError:
+                break
+            except socket.error, msg:
+                print 'socket error:', msg
+                break
+            reply = self.handle(call)
+            if reply is not None:
+                sendrecord(sock, reply)
 
-	def forkingloop(self):
-		# Like loop but uses forksession()
-		self.sock.listen(0)
-		while 1:
-			self.forksession(self.sock.accept())
+    def forkingloop(self):
+        # Like loop but uses forksession()
+        self.sock.listen(0)
+        while 1:
+            self.forksession(self.sock.accept())
 
-	def forksession(self, connection):
-		# Like session but forks off a subprocess
-		import os
-		# Wait for deceased children
-		try:
-			while 1:
-				pid, sts = os.waitpid(0, 1)
-		except os.error:
-			pass
-		pid = None
-		try:
-			pid = os.fork()
-			if pid: # Parent
-				connection[0].close()
-				return
-			# Child
-			self.session(connection)
-		finally:
-			# Make sure we don't fall through in the parent
-			if pid == 0:
-				os._exit(0)
+    def forksession(self, connection):
+        # Like session but forks off a subprocess
+        import os
+        # Wait for deceased children
+        try:
+            while 1:
+                pid, sts = os.waitpid(0, 1)
+        except os.error:
+            pass
+        pid = None
+        try:
+            pid = os.fork()
+            if pid: # Parent
+                connection[0].close()
+                return
+            # Child
+            self.session(connection)
+        finally:
+            # Make sure we don't fall through in the parent
+            if pid == 0:
+                os._exit(0)
 
 
 class UDPServer(Server):
 
-	def makesocket(self):
-		self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-		self.prot = IPPROTO_UDP
+    def makesocket(self):
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+        self.prot = IPPROTO_UDP
 
-	def loop(self):
-		while 1:
-			self.session()
+    def loop(self):
+        while 1:
+            self.session()
 
-	def session(self):
-		call, host_port = self.sock.recvfrom(8192)
-		reply = self.handle(call)
-		if reply <> None:
-			self.sock.sendto(reply, host_port)
+    def session(self):
+        call, host_port = self.sock.recvfrom(8192)
+        reply = self.handle(call)
+        if reply <> None:
+            self.sock.sendto(reply, host_port)
 
 
 # Simple test program -- dump local portmapper status
 
 def test():
-	pmap = UDPPortMapperClient('')
-	list = pmap.Dump()
-	list.sort()
-	for prog, vers, prot, port in list:
-		print prog, vers,
-		if prot == IPPROTO_TCP: print 'tcp',
-		elif prot == IPPROTO_UDP: print 'udp',
-		else: print prot,
-		print port
+    pmap = UDPPortMapperClient('')
+    list = pmap.Dump()
+    list.sort()
+    for prog, vers, prot, port in list:
+        print prog, vers,
+        if prot == IPPROTO_TCP: print 'tcp',
+        elif prot == IPPROTO_UDP: print 'udp',
+        else: print prot,
+        print port
 
 
 # Test program for broadcast operation -- dump everybody's portmapper status
 
 def testbcast():
-	import sys
-	if sys.argv[1:]:
-		bcastaddr = sys.argv[1]
-	else:
-		bcastaddr = '<broadcast>'
-	def rh(reply, fromaddr):
-		host, port = fromaddr
-		print host + '\t' + repr(reply)
-	pmap = BroadcastUDPPortMapperClient(bcastaddr)
-	pmap.set_reply_handler(rh)
-	pmap.set_timeout(5)
-	replies = pmap.Getport((100002, 1, IPPROTO_UDP, 0))
+    import sys
+    if sys.argv[1:]:
+        bcastaddr = sys.argv[1]
+    else:
+        bcastaddr = '<broadcast>'
+    def rh(reply, fromaddr):
+        host, port = fromaddr
+        print host + '\t' + repr(reply)
+    pmap = BroadcastUDPPortMapperClient(bcastaddr)
+    pmap.set_reply_handler(rh)
+    pmap.set_timeout(5)
+    replies = pmap.Getport((100002, 1, IPPROTO_UDP, 0))
 
 
 # Test program for server, with corresponding client
@@ -853,39 +853,39 @@
 # (A may be == B)
 
 def testsvr():
-	# Simple test class -- proc 1 doubles its string argument as reply
-	class S(UDPServer):
-		def handle_1(self):
-			arg = self.unpacker.unpack_string()
-			self.turn_around()
-			print 'RPC function 1 called, arg', repr(arg)
-			self.packer.pack_string(arg + arg)
-	#
-	s = S('', 0x20000000, 1, 0)
-	try:
-		s.unregister()
-	except RuntimeError, msg:
-		print 'RuntimeError:', msg, '(ignored)'
-	s.register()
-	print 'Service started...'
-	try:
-		s.loop()
-	finally:
-		s.unregister()
-		print 'Service interrupted.'
+    # Simple test class -- proc 1 doubles its string argument as reply
+    class S(UDPServer):
+        def handle_1(self):
+            arg = self.unpacker.unpack_string()
+            self.turn_around()
+            print 'RPC function 1 called, arg', repr(arg)
+            self.packer.pack_string(arg + arg)
+    #
+    s = S('', 0x20000000, 1, 0)
+    try:
+        s.unregister()
+    except RuntimeError, msg:
+        print 'RuntimeError:', msg, '(ignored)'
+    s.register()
+    print 'Service started...'
+    try:
+        s.loop()
+    finally:
+        s.unregister()
+        print 'Service interrupted.'
 
 
 def testclt():
-	import sys
-	if sys.argv[1:]: host = sys.argv[1]
-	else: host = ''
-	# Client for above server
-	class C(UDPClient):
-		def call_1(self, arg):
-			return self.make_call(1, arg, \
-				self.packer.pack_string, \
-				self.unpacker.unpack_string)
-	c = C(host, 0x20000000, 1)
-	print 'making call...'
-	reply = c.call_1('hello, world, ')
-	print 'call returned', repr(reply)
+    import sys
+    if sys.argv[1:]: host = sys.argv[1]
+    else: host = ''
+    # Client for above server
+    class C(UDPClient):
+        def call_1(self, arg):
+            return self.make_call(1, arg, \
+                    self.packer.pack_string, \
+                    self.unpacker.unpack_string)
+    c = C(host, 0x20000000, 1)
+    print 'making call...'
+    reply = c.call_1('hello, world, ')
+    print 'call returned', repr(reply)
diff --git a/Demo/rpc/xdr.py b/Demo/rpc/xdr.py
index 5338aef..df5cbaf 100644
--- a/Demo/rpc/xdr.py
+++ b/Demo/rpc/xdr.py
@@ -2,9 +2,9 @@
 
 
 try:
-	import struct
+    import struct
 except ImportError:
-	struct = None
+    struct = None
 
 
 Long = type(0L)
@@ -12,189 +12,189 @@
 
 class Packer:
 
-	def __init__(self):
-		self.reset()
+    def __init__(self):
+        self.reset()
 
-	def reset(self):
-		self.buf = ''
+    def reset(self):
+        self.buf = ''
 
-	def get_buf(self):
-		return self.buf
+    def get_buf(self):
+        return self.buf
 
-	def pack_uint(self, x):
-		self.buf = self.buf + \
-			(chr(int(x>>24 & 0xff)) + chr(int(x>>16 & 0xff)) + \
-			 chr(int(x>>8 & 0xff)) + chr(int(x & 0xff)))
-	if struct and struct.pack('l', 1) == '\0\0\0\1':
-		def pack_uint(self, x):
-			if type(x) == Long:
-				x = int((x + 0x80000000L) % 0x100000000L \
-					   - 0x80000000L)
-			self.buf = self.buf + struct.pack('l', x)
+    def pack_uint(self, x):
+        self.buf = self.buf + \
+                (chr(int(x>>24 & 0xff)) + chr(int(x>>16 & 0xff)) + \
+                 chr(int(x>>8 & 0xff)) + chr(int(x & 0xff)))
+    if struct and struct.pack('l', 1) == '\0\0\0\1':
+        def pack_uint(self, x):
+            if type(x) == Long:
+                x = int((x + 0x80000000L) % 0x100000000L \
+                           - 0x80000000L)
+            self.buf = self.buf + struct.pack('l', x)
 
-	pack_int = pack_uint
+    pack_int = pack_uint
 
-	pack_enum = pack_int
+    pack_enum = pack_int
 
-	def pack_bool(self, x):
-		if x: self.buf = self.buf + '\0\0\0\1'
-		else: self.buf = self.buf + '\0\0\0\0'
+    def pack_bool(self, x):
+        if x: self.buf = self.buf + '\0\0\0\1'
+        else: self.buf = self.buf + '\0\0\0\0'
 
-	def pack_uhyper(self, x):
-		self.pack_uint(int(x>>32 & 0xffffffff))
-		self.pack_uint(int(x & 0xffffffff))
+    def pack_uhyper(self, x):
+        self.pack_uint(int(x>>32 & 0xffffffff))
+        self.pack_uint(int(x & 0xffffffff))
 
-	pack_hyper = pack_uhyper
+    pack_hyper = pack_uhyper
 
-	def pack_float(self, x):
-		# XXX
-		self.buf = self.buf + struct.pack('f', x)
+    def pack_float(self, x):
+        # XXX
+        self.buf = self.buf + struct.pack('f', x)
 
-	def pack_double(self, x):
-		# XXX
-		self.buf = self.buf + struct.pack('d', x)
+    def pack_double(self, x):
+        # XXX
+        self.buf = self.buf + struct.pack('d', x)
 
-	def pack_fstring(self, n, s):
-		if n < 0:
-			raise ValueError, 'fstring size must be nonnegative'
-		n = ((n+3)/4)*4
-		data = s[:n]
-		data = data + (n - len(data)) * '\0'
-		self.buf = self.buf + data
+    def pack_fstring(self, n, s):
+        if n < 0:
+            raise ValueError, 'fstring size must be nonnegative'
+        n = ((n+3)/4)*4
+        data = s[:n]
+        data = data + (n - len(data)) * '\0'
+        self.buf = self.buf + data
 
-	pack_fopaque = pack_fstring
+    pack_fopaque = pack_fstring
 
-	def pack_string(self, s):
-		n = len(s)
-		self.pack_uint(n)
-		self.pack_fstring(n, s)
+    def pack_string(self, s):
+        n = len(s)
+        self.pack_uint(n)
+        self.pack_fstring(n, s)
 
-	pack_opaque = pack_string
+    pack_opaque = pack_string
 
-	def pack_list(self, list, pack_item):
-		for item in list:
-			self.pack_uint(1)
-			pack_item(item)
-		self.pack_uint(0)
+    def pack_list(self, list, pack_item):
+        for item in list:
+            self.pack_uint(1)
+            pack_item(item)
+        self.pack_uint(0)
 
-	def pack_farray(self, n, list, pack_item):
-		if len(list) <> n:
-			raise ValueError, 'wrong array size'
-		for item in list:
-			pack_item(item)
+    def pack_farray(self, n, list, pack_item):
+        if len(list) <> n:
+            raise ValueError, 'wrong array size'
+        for item in list:
+            pack_item(item)
 
-	def pack_array(self, list, pack_item):
-		n = len(list)
-		self.pack_uint(n)
-		self.pack_farray(n, list, pack_item)
+    def pack_array(self, list, pack_item):
+        n = len(list)
+        self.pack_uint(n)
+        self.pack_farray(n, list, pack_item)
 
 
 class Unpacker:
 
-	def __init__(self, data):
-		self.reset(data)
+    def __init__(self, data):
+        self.reset(data)
 
-	def reset(self, data):
-		self.buf = data
-		self.pos = 0
+    def reset(self, data):
+        self.buf = data
+        self.pos = 0
 
-	def done(self):
-		if self.pos < len(self.buf):
-			raise RuntimeError, 'unextracted data remains'
+    def done(self):
+        if self.pos < len(self.buf):
+            raise RuntimeError, 'unextracted data remains'
 
-	def unpack_uint(self):
-		i = self.pos
-		self.pos = j = i+4
-		data = self.buf[i:j]
-		if len(data) < 4:
-			raise EOFError
-		x = long(ord(data[0]))<<24 | ord(data[1])<<16 | \
-			ord(data[2])<<8 | ord(data[3])
-		# Return a Python long only if the value is not representable
-		# as a nonnegative Python int
-		if x < 0x80000000L: x = int(x)
-		return x
-	if struct and struct.unpack('l', '\0\0\0\1') == 1:
-		def unpack_uint(self):
-			i = self.pos
-			self.pos = j = i+4
-			data = self.buf[i:j]
-			if len(data) < 4:
-				raise EOFError
-			return struct.unpack('l', data)
+    def unpack_uint(self):
+        i = self.pos
+        self.pos = j = i+4
+        data = self.buf[i:j]
+        if len(data) < 4:
+            raise EOFError
+        x = long(ord(data[0]))<<24 | ord(data[1])<<16 | \
+                ord(data[2])<<8 | ord(data[3])
+        # Return a Python long only if the value is not representable
+        # as a nonnegative Python int
+        if x < 0x80000000L: x = int(x)
+        return x
+    if struct and struct.unpack('l', '\0\0\0\1') == 1:
+        def unpack_uint(self):
+            i = self.pos
+            self.pos = j = i+4
+            data = self.buf[i:j]
+            if len(data) < 4:
+                raise EOFError
+            return struct.unpack('l', data)
 
-	def unpack_int(self):
-		x = self.unpack_uint()
-		if x >= 0x80000000L: x = x - 0x100000000L
-		return int(x)
+    def unpack_int(self):
+        x = self.unpack_uint()
+        if x >= 0x80000000L: x = x - 0x100000000L
+        return int(x)
 
-	unpack_enum = unpack_int
+    unpack_enum = unpack_int
 
-	unpack_bool = unpack_int
+    unpack_bool = unpack_int
 
-	def unpack_uhyper(self):
-		hi = self.unpack_uint()
-		lo = self.unpack_uint()
-		return long(hi)<<32 | lo
+    def unpack_uhyper(self):
+        hi = self.unpack_uint()
+        lo = self.unpack_uint()
+        return long(hi)<<32 | lo
 
-	def unpack_hyper(self):
-		x = self.unpack_uhyper()
-		if x >= 0x8000000000000000L: x = x - 0x10000000000000000L
-		return x
+    def unpack_hyper(self):
+        x = self.unpack_uhyper()
+        if x >= 0x8000000000000000L: x = x - 0x10000000000000000L
+        return x
 
-	def unpack_float(self):
-		# XXX
-		i = self.pos
-		self.pos = j = i+4
-		data = self.buf[i:j]
-		if len(data) < 4:
-			raise EOFError
-		return struct.unpack('f', data)[0]
+    def unpack_float(self):
+        # XXX
+        i = self.pos
+        self.pos = j = i+4
+        data = self.buf[i:j]
+        if len(data) < 4:
+            raise EOFError
+        return struct.unpack('f', data)[0]
 
-	def unpack_double(self):
-		# XXX
-		i = self.pos
-		self.pos = j = i+8
-		data = self.buf[i:j]
-		if len(data) < 8:
-			raise EOFError
-		return struct.unpack('d', data)[0]
+    def unpack_double(self):
+        # XXX
+        i = self.pos
+        self.pos = j = i+8
+        data = self.buf[i:j]
+        if len(data) < 8:
+            raise EOFError
+        return struct.unpack('d', data)[0]
 
-	def unpack_fstring(self, n):
-		if n < 0:
-			raise ValueError, 'fstring size must be nonnegative'
-		i = self.pos
-		j = i + (n+3)/4*4
-		if j > len(self.buf):
-			raise EOFError
-		self.pos = j
-		return self.buf[i:i+n]
+    def unpack_fstring(self, n):
+        if n < 0:
+            raise ValueError, 'fstring size must be nonnegative'
+        i = self.pos
+        j = i + (n+3)/4*4
+        if j > len(self.buf):
+            raise EOFError
+        self.pos = j
+        return self.buf[i:i+n]
 
-	unpack_fopaque = unpack_fstring
+    unpack_fopaque = unpack_fstring
 
-	def unpack_string(self):
-		n = self.unpack_uint()
-		return self.unpack_fstring(n)
+    def unpack_string(self):
+        n = self.unpack_uint()
+        return self.unpack_fstring(n)
 
-	unpack_opaque = unpack_string
+    unpack_opaque = unpack_string
 
-	def unpack_list(self, unpack_item):
-		list = []
-		while 1:
-			x = self.unpack_uint()
-			if x == 0: break
-			if x <> 1:
-				raise RuntimeError, '0 or 1 expected, got %r' % (x, )
-			item = unpack_item()
-			list.append(item)
-		return list
+    def unpack_list(self, unpack_item):
+        list = []
+        while 1:
+            x = self.unpack_uint()
+            if x == 0: break
+            if x <> 1:
+                raise RuntimeError, '0 or 1 expected, got %r' % (x, )
+            item = unpack_item()
+            list.append(item)
+        return list
 
-	def unpack_farray(self, n, unpack_item):
-		list = []
-		for i in range(n):
-			list.append(unpack_item())
-		return list
+    def unpack_farray(self, n, unpack_item):
+        list = []
+        for i in range(n):
+            list.append(unpack_item())
+        return list
 
-	def unpack_array(self, unpack_item):
-		n = self.unpack_uint()
-		return self.unpack_farray(n, unpack_item)
+    def unpack_array(self, unpack_item):
+        n = self.unpack_uint()
+        return self.unpack_farray(n, unpack_item)
diff --git a/Demo/scripts/eqfix.py b/Demo/scripts/eqfix.py
index 2139d2b..deac4f8 100755
--- a/Demo/scripts/eqfix.py
+++ b/Demo/scripts/eqfix.py
@@ -1,9 +1,9 @@
 #! /usr/bin/env python
 
 # Fix Python source files to use the new equality test operator, i.e.,
-#	if x = y: ...
+#       if x = y: ...
 # is changed to
-#	if x == y: ...
+#       if x == y: ...
 # The script correctly tokenizes the Python program to reliably
 # distinguish between assignments and equality tests.
 #
@@ -39,160 +39,160 @@
 rep = sys.stdout.write
 
 def main():
-	bad = 0
-	if not sys.argv[1:]: # No arguments
-		err('usage: ' + sys.argv[0] + ' file-or-directory ...\n')
-		sys.exit(2)
-	for arg in sys.argv[1:]:
-		if os.path.isdir(arg):
-			if recursedown(arg): bad = 1
-		elif os.path.islink(arg):
-			err(arg + ': will not process symbolic links\n')
-			bad = 1
-		else:
-			if fix(arg): bad = 1
-	sys.exit(bad)
+    bad = 0
+    if not sys.argv[1:]: # No arguments
+        err('usage: ' + sys.argv[0] + ' file-or-directory ...\n')
+        sys.exit(2)
+    for arg in sys.argv[1:]:
+        if os.path.isdir(arg):
+            if recursedown(arg): bad = 1
+        elif os.path.islink(arg):
+            err(arg + ': will not process symbolic links\n')
+            bad = 1
+        else:
+            if fix(arg): bad = 1
+    sys.exit(bad)
 
 ispythonprog = regex.compile('^[a-zA-Z0-9_]+\.py$')
 def ispython(name):
-	return ispythonprog.match(name) >= 0
+    return ispythonprog.match(name) >= 0
 
 def recursedown(dirname):
-	dbg('recursedown(%r)\n' % (dirname,))
-	bad = 0
-	try:
-		names = os.listdir(dirname)
-	except os.error, msg:
-		err('%s: cannot list directory: %r\n' % (dirname, msg))
-		return 1
-	names.sort()
-	subdirs = []
-	for name in names:
-		if name in (os.curdir, os.pardir): continue
-		fullname = os.path.join(dirname, name)
-		if os.path.islink(fullname): pass
-		elif os.path.isdir(fullname):
-			subdirs.append(fullname)
-		elif ispython(name):
-			if fix(fullname): bad = 1
-	for fullname in subdirs:
-		if recursedown(fullname): bad = 1
-	return bad
+    dbg('recursedown(%r)\n' % (dirname,))
+    bad = 0
+    try:
+        names = os.listdir(dirname)
+    except os.error, msg:
+        err('%s: cannot list directory: %r\n' % (dirname, msg))
+        return 1
+    names.sort()
+    subdirs = []
+    for name in names:
+        if name in (os.curdir, os.pardir): continue
+        fullname = os.path.join(dirname, name)
+        if os.path.islink(fullname): pass
+        elif os.path.isdir(fullname):
+            subdirs.append(fullname)
+        elif ispython(name):
+            if fix(fullname): bad = 1
+    for fullname in subdirs:
+        if recursedown(fullname): bad = 1
+    return bad
 
 def fix(filename):
-##	dbg('fix(%r)\n' % (dirname,))
-	try:
-		f = open(filename, 'r')
-	except IOError, msg:
-		err('%s: cannot open: %r\n' % (filename, msg))
-		return 1
-	head, tail = os.path.split(filename)
-	tempname = os.path.join(head, '@' + tail)
-	g = None
-	# If we find a match, we rewind the file and start over but
-	# now copy everything to a temp file.
-	lineno = 0
-	while 1:
-		line = f.readline()
-		if not line: break
-		lineno = lineno + 1
-		if g is None and '\0' in line:
-			# Check for binary files
-			err(filename + ': contains null bytes; not fixed\n')
-			f.close()
-			return 1
-		if lineno == 1 and g is None and line[:2] == '#!':
-			# Check for non-Python scripts
-			words = string.split(line[2:])
-			if words and regex.search('[pP]ython', words[0]) < 0:
-				msg = filename + ': ' + words[0]
-				msg = msg + ' script; not fixed\n'
-				err(msg)
-				f.close()
-				return 1
-		while line[-2:] == '\\\n':
-			nextline = f.readline()
-			if not nextline: break
-			line = line + nextline
-			lineno = lineno + 1
-		newline = fixline(line)
-		if newline != line:
-			if g is None:
-				try:
-					g = open(tempname, 'w')
-				except IOError, msg:
-					f.close()
-					err('%s: cannot create: %r\n' % (tempname, msg))
-					return 1
-				f.seek(0)
-				lineno = 0
-				rep(filename + ':\n')
-				continue # restart from the beginning
-			rep(repr(lineno) + '\n')
-			rep('< ' + line)
-			rep('> ' + newline)
-		if g is not None:
-			g.write(newline)
+##      dbg('fix(%r)\n' % (dirname,))
+    try:
+        f = open(filename, 'r')
+    except IOError, msg:
+        err('%s: cannot open: %r\n' % (filename, msg))
+        return 1
+    head, tail = os.path.split(filename)
+    tempname = os.path.join(head, '@' + tail)
+    g = None
+    # If we find a match, we rewind the file and start over but
+    # now copy everything to a temp file.
+    lineno = 0
+    while 1:
+        line = f.readline()
+        if not line: break
+        lineno = lineno + 1
+        if g is None and '\0' in line:
+            # Check for binary files
+            err(filename + ': contains null bytes; not fixed\n')
+            f.close()
+            return 1
+        if lineno == 1 and g is None and line[:2] == '#!':
+            # Check for non-Python scripts
+            words = string.split(line[2:])
+            if words and regex.search('[pP]ython', words[0]) < 0:
+                msg = filename + ': ' + words[0]
+                msg = msg + ' script; not fixed\n'
+                err(msg)
+                f.close()
+                return 1
+        while line[-2:] == '\\\n':
+            nextline = f.readline()
+            if not nextline: break
+            line = line + nextline
+            lineno = lineno + 1
+        newline = fixline(line)
+        if newline != line:
+            if g is None:
+                try:
+                    g = open(tempname, 'w')
+                except IOError, msg:
+                    f.close()
+                    err('%s: cannot create: %r\n' % (tempname, msg))
+                    return 1
+                f.seek(0)
+                lineno = 0
+                rep(filename + ':\n')
+                continue # restart from the beginning
+            rep(repr(lineno) + '\n')
+            rep('< ' + line)
+            rep('> ' + newline)
+        if g is not None:
+            g.write(newline)
 
-	# End of file
-	f.close()
-	if not g: return 0 # No changes
-	
-	# Finishing touch -- move files
+    # End of file
+    f.close()
+    if not g: return 0 # No changes
 
-	# First copy the file's mode to the temp file
-	try:
-		statbuf = os.stat(filename)
-		os.chmod(tempname, statbuf[ST_MODE] & 07777)
-	except os.error, msg:
-		err('%s: warning: chmod failed (%r)\n' % (tempname, msg))
-	# Then make a backup of the original file as filename~
-	try:
-		os.rename(filename, filename + '~')
-	except os.error, msg:
-		err('%s: warning: backup failed (%r)\n' % (filename, msg))
-	# Now move the temp file to the original file
-	try:
-		os.rename(tempname, filename)
-	except os.error, msg:
-		err('%s: rename failed (%r)\n' % (filename, msg))
-		return 1
-	# Return succes
-	return 0
+    # Finishing touch -- move files
+
+    # First copy the file's mode to the temp file
+    try:
+        statbuf = os.stat(filename)
+        os.chmod(tempname, statbuf[ST_MODE] & 07777)
+    except os.error, msg:
+        err('%s: warning: chmod failed (%r)\n' % (tempname, msg))
+    # Then make a backup of the original file as filename~
+    try:
+        os.rename(filename, filename + '~')
+    except os.error, msg:
+        err('%s: warning: backup failed (%r)\n' % (filename, msg))
+    # Now move the temp file to the original file
+    try:
+        os.rename(tempname, filename)
+    except os.error, msg:
+        err('%s: rename failed (%r)\n' % (filename, msg))
+        return 1
+    # Return succes
+    return 0
 
 
 from tokenize import tokenprog
 
 match = {'if':':', 'elif':':', 'while':':', 'return':'\n', \
-	 '(':')', '[':']', '{':'}', '`':'`'}
+         '(':')', '[':']', '{':'}', '`':'`'}
 
 def fixline(line):
-	# Quick check for easy case
-	if '=' not in line: return line
-	
-	i, n = 0, len(line)
-	stack = []
-	while i < n:
-		j = tokenprog.match(line, i)
-		if j < 0:
-			# A bad token; forget about the rest of this line
-			print '(Syntax error:)'
-			print line,
-			return line
-		a, b = tokenprog.regs[3] # Location of the token proper
-		token = line[a:b]
-		i = i+j
-		if stack and token == stack[-1]:
-			del stack[-1]
-		elif match.has_key(token):
-			stack.append(match[token])
-		elif token == '=' and stack:
-			line = line[:a] + '==' + line[b:]
-			i, n = a + len('=='), len(line)
-		elif token == '==' and not stack:
-			print '(Warning: \'==\' at top level:)'
-			print line,
-	return line
+    # Quick check for easy case
+    if '=' not in line: return line
+
+    i, n = 0, len(line)
+    stack = []
+    while i < n:
+        j = tokenprog.match(line, i)
+        if j < 0:
+            # A bad token; forget about the rest of this line
+            print '(Syntax error:)'
+            print line,
+            return line
+        a, b = tokenprog.regs[3] # Location of the token proper
+        token = line[a:b]
+        i = i+j
+        if stack and token == stack[-1]:
+            del stack[-1]
+        elif match.has_key(token):
+            stack.append(match[token])
+        elif token == '=' and stack:
+            line = line[:a] + '==' + line[b:]
+            i, n = a + len('=='), len(line)
+        elif token == '==' and not stack:
+            print '(Warning: \'==\' at top level:)'
+            print line,
+    return line
 
 
 main()
diff --git a/Demo/scripts/fact.py b/Demo/scripts/fact.py
index 6cc389e..5497f66 100755
--- a/Demo/scripts/fact.py
+++ b/Demo/scripts/fact.py
@@ -8,41 +8,41 @@
 import sys
 from math import sqrt
 
-error = 'fact.error'		# exception
+error = 'fact.error'            # exception
 
 def fact(n):
-	if n < 1: raise error	# fact() argument should be >= 1
-	if n == 1: return []	# special case
-	res = []
-	# Treat even factors special, so we can use i = i+2 later
-	while n%2 == 0:
-		res.append(2)
-		n = n/2
-	# Try odd numbers up to sqrt(n)
-	limit = sqrt(float(n+1))
-	i = 3
-	while i <= limit:
-		if n%i == 0:
-			res.append(i)
-			n = n/i
-			limit = sqrt(n+1)
-		else:
-			i = i+2
-	if n != 1:
-		res.append(n)
-	return res
+    if n < 1: raise error   # fact() argument should be >= 1
+    if n == 1: return []    # special case
+    res = []
+    # Treat even factors special, so we can use i = i+2 later
+    while n%2 == 0:
+        res.append(2)
+        n = n/2
+    # Try odd numbers up to sqrt(n)
+    limit = sqrt(float(n+1))
+    i = 3
+    while i <= limit:
+        if n%i == 0:
+            res.append(i)
+            n = n/i
+            limit = sqrt(n+1)
+        else:
+            i = i+2
+    if n != 1:
+        res.append(n)
+    return res
 
 def main():
-	if len(sys.argv) > 1:
-		for arg in sys.argv[1:]:
-			n = eval(arg)
-			print n, fact(n)
-	else:
-		try:
-			while 1:
-				n = input()
-				print n, fact(n)
-		except EOFError:
-			pass
+    if len(sys.argv) > 1:
+        for arg in sys.argv[1:]:
+            n = eval(arg)
+            print n, fact(n)
+    else:
+        try:
+            while 1:
+                n = input()
+                print n, fact(n)
+        except EOFError:
+            pass
 
 main()
diff --git a/Demo/scripts/ftpstats.py b/Demo/scripts/ftpstats.py
index 8af72b5..13d0553 100755
--- a/Demo/scripts/ftpstats.py
+++ b/Demo/scripts/ftpstats.py
@@ -21,124 +21,124 @@
 prog = regex.compile(pat)
 
 def main():
-	maxitems = 25
-	search = None
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'm:s:')
-	except getopt.error, msg:
-		print msg
-		print 'usage: ftpstats [-m maxitems] [file]'
-		sys.exit(2)
-	for o, a in opts:
-		if o == '-m':
-			maxitems = string.atoi(a)
-		if o == '-s':
-			search = a
-	file = '/usr/adm/ftpd'
-	if args: file = args[0]
-	if file == '-':
-		f = sys.stdin
-	else:
-		try:
-			f = open(file, 'r')
-		except IOError, msg:
-			print file, ':', msg
-			sys.exit(1)
-	bydate = {}
-	bytime = {}
-	byfile = {}
-	bydir = {}
-	byhost = {}
-	byuser = {}
-	bytype = {}
-	lineno = 0
-	try:
-		while 1:
-			line = f.readline()
-			if not line: break
-			lineno = lineno + 1
-			if search and string.find(line, search) < 0:
-				continue
-			if prog.match(line) < 0:
-				print 'Bad line', lineno, ':', repr(line)
-				continue
-			items = prog.group(1, 2, 3, 4, 5, 6)
-			(logtime, loguser, loghost, logfile, logbytes,
-			 logxxx2) = items
-## 			print logtime
-## 			print '-->', loguser
-## 			print '--> -->', loghost
-## 			print '--> --> -->', logfile
-## 			print '--> --> --> -->', logbytes
-## 			print '--> --> --> --> -->', logxxx2
-## 			for i in logtime, loghost, logbytes, logxxx2:
-## 				if '!' in i: print '???', i
-			add(bydate, logtime[-4:] + ' ' + logtime[:6], items)
-			add(bytime, logtime[7:9] + ':00-59', items)
-			direction, logfile = logfile[0], logfile[1:]
-			# The real path probably starts at the last //...
-			while 1:
-				i = string.find(logfile, '//')
-				if i < 0: break
-				logfile = logfile[i+1:]
-			add(byfile, logfile + ' ' + direction, items)
-			logdir = os.path.dirname(logfile)
-##		logdir = os.path.normpath(logdir) + '/.'
-			while 1:
-				add(bydir, logdir + ' ' + direction, items)
-				dirhead = os.path.dirname(logdir)
-				if dirhead == logdir: break
-				logdir = dirhead
-			add(byhost, loghost, items)
-			add(byuser, loguser, items)
-			add(bytype, direction, items)
-	except KeyboardInterrupt:
-		print 'Interrupted at line', lineno
-	show(bytype, 'by transfer direction', maxitems)
-	show(bydir, 'by directory', maxitems)
-	show(byfile, 'by file', maxitems)
-	show(byhost, 'by host', maxitems)
-	show(byuser, 'by user', maxitems)
-	showbar(bydate, 'by date')
-	showbar(bytime, 'by time of day')
+    maxitems = 25
+    search = None
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], 'm:s:')
+    except getopt.error, msg:
+        print msg
+        print 'usage: ftpstats [-m maxitems] [file]'
+        sys.exit(2)
+    for o, a in opts:
+        if o == '-m':
+            maxitems = string.atoi(a)
+        if o == '-s':
+            search = a
+    file = '/usr/adm/ftpd'
+    if args: file = args[0]
+    if file == '-':
+        f = sys.stdin
+    else:
+        try:
+            f = open(file, 'r')
+        except IOError, msg:
+            print file, ':', msg
+            sys.exit(1)
+    bydate = {}
+    bytime = {}
+    byfile = {}
+    bydir = {}
+    byhost = {}
+    byuser = {}
+    bytype = {}
+    lineno = 0
+    try:
+        while 1:
+            line = f.readline()
+            if not line: break
+            lineno = lineno + 1
+            if search and string.find(line, search) < 0:
+                continue
+            if prog.match(line) < 0:
+                print 'Bad line', lineno, ':', repr(line)
+                continue
+            items = prog.group(1, 2, 3, 4, 5, 6)
+            (logtime, loguser, loghost, logfile, logbytes,
+             logxxx2) = items
+##                      print logtime
+##                      print '-->', loguser
+##                      print '--> -->', loghost
+##                      print '--> --> -->', logfile
+##                      print '--> --> --> -->', logbytes
+##                      print '--> --> --> --> -->', logxxx2
+##                      for i in logtime, loghost, logbytes, logxxx2:
+##                              if '!' in i: print '???', i
+            add(bydate, logtime[-4:] + ' ' + logtime[:6], items)
+            add(bytime, logtime[7:9] + ':00-59', items)
+            direction, logfile = logfile[0], logfile[1:]
+            # The real path probably starts at the last //...
+            while 1:
+                i = string.find(logfile, '//')
+                if i < 0: break
+                logfile = logfile[i+1:]
+            add(byfile, logfile + ' ' + direction, items)
+            logdir = os.path.dirname(logfile)
+##              logdir = os.path.normpath(logdir) + '/.'
+            while 1:
+                add(bydir, logdir + ' ' + direction, items)
+                dirhead = os.path.dirname(logdir)
+                if dirhead == logdir: break
+                logdir = dirhead
+            add(byhost, loghost, items)
+            add(byuser, loguser, items)
+            add(bytype, direction, items)
+    except KeyboardInterrupt:
+        print 'Interrupted at line', lineno
+    show(bytype, 'by transfer direction', maxitems)
+    show(bydir, 'by directory', maxitems)
+    show(byfile, 'by file', maxitems)
+    show(byhost, 'by host', maxitems)
+    show(byuser, 'by user', maxitems)
+    showbar(bydate, 'by date')
+    showbar(bytime, 'by time of day')
 
 def showbar(dict, title):
-	n = len(title)
-	print '='*((70-n)/2), title, '='*((71-n)/2)
-	list = []
-	keys = dict.keys()
-	keys.sort()
-	for key in keys:
-		n = len(str(key))
-		list.append((len(dict[key]), key))
-	maxkeylength = 0
-	maxcount = 0
-	for count, key in list:
-		maxkeylength = max(maxkeylength, len(key))
-		maxcount = max(maxcount, count)
-	maxbarlength = 72 - maxkeylength - 7
-	for count, key in list:
-		barlength = int(round(maxbarlength*float(count)/maxcount))
-		bar = '*'*barlength
-		print '%5d %-*s %s' % (count, maxkeylength, key, bar)
+    n = len(title)
+    print '='*((70-n)/2), title, '='*((71-n)/2)
+    list = []
+    keys = dict.keys()
+    keys.sort()
+    for key in keys:
+        n = len(str(key))
+        list.append((len(dict[key]), key))
+    maxkeylength = 0
+    maxcount = 0
+    for count, key in list:
+        maxkeylength = max(maxkeylength, len(key))
+        maxcount = max(maxcount, count)
+    maxbarlength = 72 - maxkeylength - 7
+    for count, key in list:
+        barlength = int(round(maxbarlength*float(count)/maxcount))
+        bar = '*'*barlength
+        print '%5d %-*s %s' % (count, maxkeylength, key, bar)
 
 def show(dict, title, maxitems):
-	if len(dict) > maxitems:
-		title = title + ' (first %d)'%maxitems
-	n = len(title)
-	print '='*((70-n)/2), title, '='*((71-n)/2)
-	list = []
-	keys = dict.keys()
-	for key in keys:
-		list.append((-len(dict[key]), key))
-	list.sort()
-	for count, key in list[:maxitems]:
-		print '%5d %s' % (-count, key)
+    if len(dict) > maxitems:
+        title = title + ' (first %d)'%maxitems
+    n = len(title)
+    print '='*((70-n)/2), title, '='*((71-n)/2)
+    list = []
+    keys = dict.keys()
+    for key in keys:
+        list.append((-len(dict[key]), key))
+    list.sort()
+    for count, key in list[:maxitems]:
+        print '%5d %s' % (-count, key)
 
 def add(dict, key, item):
-	if dict.has_key(key):
-		dict[key].append(item)
-	else:
-		dict[key] = [item]
+    if dict.has_key(key):
+        dict[key].append(item)
+    else:
+        dict[key] = [item]
 
 main()
diff --git a/Demo/scripts/lpwatch.py b/Demo/scripts/lpwatch.py
index 00afba9..0af3cbd 100755
--- a/Demo/scripts/lpwatch.py
+++ b/Demo/scripts/lpwatch.py
@@ -12,98 +12,98 @@
 DEF_DELAY = 10
 
 def main():
-	delay = DEF_DELAY # XXX Use getopt() later
-	try:
-		thisuser = posix.environ['LOGNAME']
-	except:
-		thisuser = posix.environ['USER']
-	printers = sys.argv[1:]
-	if printers:
-		# Strip '-P' from printer names just in case
-		# the user specified it...
-		for i in range(len(printers)):
-			if printers[i][:2] == '-P':
-				printers[i] = printers[i][2:]
-	else:
-		if posix.environ.has_key('PRINTER'):
-			printers = [posix.environ['PRINTER']]
-		else:
-			printers = [DEF_PRINTER]
-	#
-	clearhome = posix.popen('clear', 'r').read()
-	#
-	while 1:
-		text = clearhome
-		for name in printers:
-			text = text + makestatus(name, thisuser) + '\n'
-		print text
-		time.sleep(delay)
+    delay = DEF_DELAY # XXX Use getopt() later
+    try:
+        thisuser = posix.environ['LOGNAME']
+    except:
+        thisuser = posix.environ['USER']
+    printers = sys.argv[1:]
+    if printers:
+        # Strip '-P' from printer names just in case
+        # the user specified it...
+        for i in range(len(printers)):
+            if printers[i][:2] == '-P':
+                printers[i] = printers[i][2:]
+    else:
+        if posix.environ.has_key('PRINTER'):
+            printers = [posix.environ['PRINTER']]
+        else:
+            printers = [DEF_PRINTER]
+    #
+    clearhome = posix.popen('clear', 'r').read()
+    #
+    while 1:
+        text = clearhome
+        for name in printers:
+            text = text + makestatus(name, thisuser) + '\n'
+        print text
+        time.sleep(delay)
 
 def makestatus(name, thisuser):
-	pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
-	lines = []
-	users = {}
-	aheadbytes = 0
-	aheadjobs = 0
-	userseen = 0
-	totalbytes = 0
-	totaljobs = 0
-	while 1:
-		line = pipe.readline()
-		if not line: break
-		fields = string.split(line)
-		n = len(fields)
-		if len(fields) >= 6 and fields[n-1] == 'bytes':
-			rank = fields[0]
-			user = fields[1]
-			job = fields[2]
-			files = fields[3:-2]
-			bytes = eval(fields[n-2])
-			if user == thisuser:
-				userseen = 1
-			elif not userseen:
-				aheadbytes = aheadbytes + bytes
-				aheadjobs = aheadjobs + 1
-			totalbytes = totalbytes + bytes
-			totaljobs = totaljobs + 1
-			if users.has_key(user):
-				ujobs, ubytes = users[user]
-			else:
-				ujobs, ubytes = 0, 0
-			ujobs = ujobs + 1
-			ubytes = ubytes + bytes
-			users[user] = ujobs, ubytes
-		else:
-			if fields and fields[0] <> 'Rank':
-				line = string.strip(line)
-				if line == 'no entries':
-					line = name + ': idle'
-				elif line[-22:] == ' is ready and printing':
-					line = name
-				lines.append(line)
-	#
-	if totaljobs:
-		line = '%d K' % ((totalbytes+1023)/1024)
-		if totaljobs <> len(users):
-			line = line + ' (%d jobs)' % totaljobs
-		if len(users) == 1:
-			line = line + ' for %s' % (users.keys()[0],)
-		else:
-			line = line + ' for %d users' % len(users)
-			if userseen:
-				if aheadjobs == 0:
-					line =  line + ' (%s first)' % thisuser
-				else:
-					line = line + ' (%d K before %s)' % (
-					               (aheadbytes+1023)/1024, thisuser)
-		lines.append(line)
-	#
-	sts = pipe.close()
-	if sts:
-		lines.append('lpq exit status %r' % (sts,))
-	return string.joinfields(lines, ': ')
+    pipe = posix.popen('lpq -P' + name + ' 2>&1', 'r')
+    lines = []
+    users = {}
+    aheadbytes = 0
+    aheadjobs = 0
+    userseen = 0
+    totalbytes = 0
+    totaljobs = 0
+    while 1:
+        line = pipe.readline()
+        if not line: break
+        fields = string.split(line)
+        n = len(fields)
+        if len(fields) >= 6 and fields[n-1] == 'bytes':
+            rank = fields[0]
+            user = fields[1]
+            job = fields[2]
+            files = fields[3:-2]
+            bytes = eval(fields[n-2])
+            if user == thisuser:
+                userseen = 1
+            elif not userseen:
+                aheadbytes = aheadbytes + bytes
+                aheadjobs = aheadjobs + 1
+            totalbytes = totalbytes + bytes
+            totaljobs = totaljobs + 1
+            if users.has_key(user):
+                ujobs, ubytes = users[user]
+            else:
+                ujobs, ubytes = 0, 0
+            ujobs = ujobs + 1
+            ubytes = ubytes + bytes
+            users[user] = ujobs, ubytes
+        else:
+            if fields and fields[0] <> 'Rank':
+                line = string.strip(line)
+                if line == 'no entries':
+                    line = name + ': idle'
+                elif line[-22:] == ' is ready and printing':
+                    line = name
+                lines.append(line)
+    #
+    if totaljobs:
+        line = '%d K' % ((totalbytes+1023)/1024)
+        if totaljobs <> len(users):
+            line = line + ' (%d jobs)' % totaljobs
+        if len(users) == 1:
+            line = line + ' for %s' % (users.keys()[0],)
+        else:
+            line = line + ' for %d users' % len(users)
+            if userseen:
+                if aheadjobs == 0:
+                    line =  line + ' (%s first)' % thisuser
+                else:
+                    line = line + ' (%d K before %s)' % (
+                                   (aheadbytes+1023)/1024, thisuser)
+        lines.append(line)
+    #
+    sts = pipe.close()
+    if sts:
+        lines.append('lpq exit status %r' % (sts,))
+    return string.joinfields(lines, ': ')
 
 try:
-	main()
+    main()
 except KeyboardInterrupt:
-	pass
+    pass
diff --git a/Demo/scripts/makedir.py b/Demo/scripts/makedir.py
index 4c00d88..209f6c4 100755
--- a/Demo/scripts/makedir.py
+++ b/Demo/scripts/makedir.py
@@ -8,13 +8,13 @@
 import sys, os
 
 def main():
-	for p in sys.argv[1:]:
-		makedirs(p)
+    for p in sys.argv[1:]:
+        makedirs(p)
 
 def makedirs(p):
-	if p and not os.path.isdir(p):
-		head, tail = os.path.split(p)
-		makedirs(head)
-		os.mkdir(p, 0777)
+    if p and not os.path.isdir(p):
+        head, tail = os.path.split(p)
+        makedirs(head)
+        os.mkdir(p, 0777)
 
 main()
diff --git a/Demo/scripts/markov.py b/Demo/scripts/markov.py
index b0583d1..3329351 100755
--- a/Demo/scripts/markov.py
+++ b/Demo/scripts/markov.py
@@ -1,116 +1,116 @@
 #! /usr/bin/env python
 
 class Markov:
-	def __init__(self, histsize, choice):
-		self.histsize = histsize
-		self.choice = choice
-		self.trans = {}
-	def add(self, state, next):
-		if not self.trans.has_key(state):
-			self.trans[state] = [next]
-		else:
-			self.trans[state].append(next)
-	def put(self, seq):
-		n = self.histsize
-		add = self.add
-		add(None, seq[:0])
-		for i in range(len(seq)):
-			add(seq[max(0, i-n):i], seq[i:i+1])
-		add(seq[len(seq)-n:], None)
-	def get(self):
-		choice = self.choice
-		trans = self.trans
-		n = self.histsize
-		seq = choice(trans[None])
-		while 1:
-			subseq = seq[max(0, len(seq)-n):]
-			options = trans[subseq]
-			next = choice(options)
-			if not next: break
-			seq = seq + next
-		return seq
+    def __init__(self, histsize, choice):
+        self.histsize = histsize
+        self.choice = choice
+        self.trans = {}
+    def add(self, state, next):
+        if not self.trans.has_key(state):
+            self.trans[state] = [next]
+        else:
+            self.trans[state].append(next)
+    def put(self, seq):
+        n = self.histsize
+        add = self.add
+        add(None, seq[:0])
+        for i in range(len(seq)):
+            add(seq[max(0, i-n):i], seq[i:i+1])
+        add(seq[len(seq)-n:], None)
+    def get(self):
+        choice = self.choice
+        trans = self.trans
+        n = self.histsize
+        seq = choice(trans[None])
+        while 1:
+            subseq = seq[max(0, len(seq)-n):]
+            options = trans[subseq]
+            next = choice(options)
+            if not next: break
+            seq = seq + next
+        return seq
 
 def test():
-	import sys, string, random, getopt
-	args = sys.argv[1:]
-	try:
-		opts, args = getopt.getopt(args, '0123456789cdw')
-	except getopt.error:
-		print 'Usage: markov [-#] [-cddqw] [file] ...'
-		print 'Options:'
-		print '-#: 1-digit history size (default 2)'
-		print '-c: characters (default)'
-		print '-w: words'
-		print '-d: more debugging output'
-		print '-q: no debugging output'
-		print 'Input files (default stdin) are split in paragraphs'
-		print 'separated blank lines and each paragraph is split'
-		print 'in words by whitespace, then reconcatenated with'
-		print 'exactly one space separating words.'
-		print 'Output consists of paragraphs separated by blank'
-		print 'lines, where lines are no longer than 72 characters.'
-	histsize = 2
-	do_words = 0
-	debug = 1
-	for o, a in opts:
-		if '-0' <= o <= '-9': histsize = eval(o[1:])
-		if o == '-c': do_words = 0
-		if o == '-d': debug = debug + 1
-		if o == '-q': debug = 0
-		if o == '-w': do_words = 1
-	if not args: args = ['-']
-	m = Markov(histsize, random.choice)
-	try:
-	    for filename in args:
-		    if filename == '-':
-			    f = sys.stdin
-			    if f.isatty():
-				    print 'Sorry, need stdin from file'
-				    continue
-		    else:
-			    f = open(filename, 'r')
-		    if debug: print 'processing', filename, '...'
-		    text = f.read()
-		    f.close()
-		    paralist = string.splitfields(text, '\n\n')
-		    for para in paralist:
-			    if debug > 1: print 'feeding ...'
-			    words = string.split(para)
-			    if words:
-				    if do_words: data = tuple(words)
-				    else: data = string.joinfields(words, ' ')
-				    m.put(data)
-	except KeyboardInterrupt:
-		print 'Interrupted -- continue with data read so far'
-	if not m.trans:
-		print 'No valid input files'
-		return
-	if debug: print 'done.'
-	if debug > 1:
-		for key in m.trans.keys():
-			if key is None or len(key) < histsize:
-				print repr(key), m.trans[key]
-		if histsize == 0: print repr(''), m.trans['']
-		print
-	while 1:
-		data = m.get()
-		if do_words: words = data
-		else: words = string.split(data)
-		n = 0
-		limit = 72
-		for w in words:
-			if n + len(w) > limit:
-				print
-				n = 0
-			print w,
-			n = n + len(w) + 1
-		print
-		print
+    import sys, string, random, getopt
+    args = sys.argv[1:]
+    try:
+        opts, args = getopt.getopt(args, '0123456789cdw')
+    except getopt.error:
+        print 'Usage: markov [-#] [-cddqw] [file] ...'
+        print 'Options:'
+        print '-#: 1-digit history size (default 2)'
+        print '-c: characters (default)'
+        print '-w: words'
+        print '-d: more debugging output'
+        print '-q: no debugging output'
+        print 'Input files (default stdin) are split in paragraphs'
+        print 'separated blank lines and each paragraph is split'
+        print 'in words by whitespace, then reconcatenated with'
+        print 'exactly one space separating words.'
+        print 'Output consists of paragraphs separated by blank'
+        print 'lines, where lines are no longer than 72 characters.'
+    histsize = 2
+    do_words = 0
+    debug = 1
+    for o, a in opts:
+        if '-0' <= o <= '-9': histsize = eval(o[1:])
+        if o == '-c': do_words = 0
+        if o == '-d': debug = debug + 1
+        if o == '-q': debug = 0
+        if o == '-w': do_words = 1
+    if not args: args = ['-']
+    m = Markov(histsize, random.choice)
+    try:
+        for filename in args:
+            if filename == '-':
+                f = sys.stdin
+                if f.isatty():
+                    print 'Sorry, need stdin from file'
+                    continue
+            else:
+                f = open(filename, 'r')
+            if debug: print 'processing', filename, '...'
+            text = f.read()
+            f.close()
+            paralist = string.splitfields(text, '\n\n')
+            for para in paralist:
+                if debug > 1: print 'feeding ...'
+                words = string.split(para)
+                if words:
+                    if do_words: data = tuple(words)
+                    else: data = string.joinfields(words, ' ')
+                    m.put(data)
+    except KeyboardInterrupt:
+        print 'Interrupted -- continue with data read so far'
+    if not m.trans:
+        print 'No valid input files'
+        return
+    if debug: print 'done.'
+    if debug > 1:
+        for key in m.trans.keys():
+            if key is None or len(key) < histsize:
+                print repr(key), m.trans[key]
+        if histsize == 0: print repr(''), m.trans['']
+        print
+    while 1:
+        data = m.get()
+        if do_words: words = data
+        else: words = string.split(data)
+        n = 0
+        limit = 72
+        for w in words:
+            if n + len(w) > limit:
+                print
+                n = 0
+            print w,
+            n = n + len(w) + 1
+        print
+        print
 
 def tuple(list):
-	if len(list) == 0: return ()
-	if len(list) == 1: return (list[0],)
-	i = len(list)/2
-	return tuple(list[:i]) + tuple(list[i:])
+    if len(list) == 0: return ()
+    if len(list) == 1: return (list[0],)
+    i = len(list)/2
+    return tuple(list[:i]) + tuple(list[i:])
 
 test()
diff --git a/Demo/scripts/mboxconvert.py b/Demo/scripts/mboxconvert.py
index 996537d..ba1f734 100755
--- a/Demo/scripts/mboxconvert.py
+++ b/Demo/scripts/mboxconvert.py
@@ -13,111 +13,111 @@
 import regex
 
 def main():
-	dofile = mmdf
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'f')
-	except getopt.error, msg:
-		sys.stderr.write('%s\n' % msg)
-		sys.exit(2)
-	for o, a in opts:
-		if o == '-f':
-			dofile = message
-	if not args:
-		args = ['-']
-	sts = 0
-	for arg in args:
-		if arg == '-' or arg == '':
-			sts = dofile(sys.stdin) or sts
-		elif os.path.isdir(arg):
-			sts = mh(arg) or sts
-		elif os.path.isfile(arg):
-			try:
-				f = open(arg)
-			except IOError, msg:
-				sys.stderr.write('%s: %s\n' % (arg, msg))
-				sts = 1
-				continue
-			sts = dofile(f) or sts
-			f.close()
-		else:
-			sys.stderr.write('%s: not found\n' % arg)
-			sts = 1
-	if sts:
-		sys.exit(sts)
+    dofile = mmdf
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], 'f')
+    except getopt.error, msg:
+        sys.stderr.write('%s\n' % msg)
+        sys.exit(2)
+    for o, a in opts:
+        if o == '-f':
+            dofile = message
+    if not args:
+        args = ['-']
+    sts = 0
+    for arg in args:
+        if arg == '-' or arg == '':
+            sts = dofile(sys.stdin) or sts
+        elif os.path.isdir(arg):
+            sts = mh(arg) or sts
+        elif os.path.isfile(arg):
+            try:
+                f = open(arg)
+            except IOError, msg:
+                sys.stderr.write('%s: %s\n' % (arg, msg))
+                sts = 1
+                continue
+            sts = dofile(f) or sts
+            f.close()
+        else:
+            sys.stderr.write('%s: not found\n' % arg)
+            sts = 1
+    if sts:
+        sys.exit(sts)
 
 numeric = regex.compile('[1-9][0-9]*')
 
 def mh(dir):
-	sts = 0
-	msgs = os.listdir(dir)
-	for msg in msgs:
-		if numeric.match(msg) != len(msg):
-			continue
-		fn = os.path.join(dir, msg)
-		try:
-			f = open(fn)
-		except IOError, msg:
-			sys.stderr.write('%s: %s\n' % (fn, msg))
-			sts = 1
-			continue
-		sts = message(f) or sts
-	return sts
+    sts = 0
+    msgs = os.listdir(dir)
+    for msg in msgs:
+        if numeric.match(msg) != len(msg):
+            continue
+        fn = os.path.join(dir, msg)
+        try:
+            f = open(fn)
+        except IOError, msg:
+            sys.stderr.write('%s: %s\n' % (fn, msg))
+            sts = 1
+            continue
+        sts = message(f) or sts
+    return sts
 
 def mmdf(f):
-	sts = 0
-	while 1:
-		line = f.readline()
-		if not line:
-			break
-		if line == '\1\1\1\1\n':
-			sts = message(f, line) or sts
-		else:
-			sys.stderr.write(
-				'Bad line in MMFD mailbox: %r\n' % (line,))
-	return sts
+    sts = 0
+    while 1:
+        line = f.readline()
+        if not line:
+            break
+        if line == '\1\1\1\1\n':
+            sts = message(f, line) or sts
+        else:
+            sys.stderr.write(
+                    'Bad line in MMFD mailbox: %r\n' % (line,))
+    return sts
 
 counter = 0 # for generating unique Message-ID headers
 
 def message(f, delimiter = ''):
-	sts = 0
-	# Parse RFC822 header
-	m = rfc822.Message(f)
-	# Write unix header line
-	fullname, email = m.getaddr('From')
-	tt = m.getdate('Date')
-	if tt:
-		t = time.mktime(tt)
-	else:
-		sys.stderr.write(
-			'Unparseable date: %r\n' % (m.getheader('Date'),))
-		t = os.fstat(f.fileno())[stat.ST_MTIME]
-	print 'From', email, time.ctime(t)
-	# Copy RFC822 header
-	for line in m.headers:
-		print line,
-	# Invent Message-ID header if none is present
-	if not m.has_key('message-id'):
-		global counter
-		counter = counter + 1
-		msgid = "<%s.%d>" % (hex(t), counter)
-		sys.stderr.write("Adding Message-ID %s (From %s)\n" %
-				 (msgid, email))
-		print "Message-ID:", msgid
-	print
-	# Copy body
-	while 1:
-		line = f.readline()
-		if line == delimiter:
-			break
-		if not line:
-			sys.stderr.write('Unexpected EOF in message\n')
-			sts = 1
-			break
-		if line[:5] == 'From ':
-			line = '>' + line
-		print line,
-	# Print trailing newline
-	print
-	return sts
+    sts = 0
+    # Parse RFC822 header
+    m = rfc822.Message(f)
+    # Write unix header line
+    fullname, email = m.getaddr('From')
+    tt = m.getdate('Date')
+    if tt:
+        t = time.mktime(tt)
+    else:
+        sys.stderr.write(
+                'Unparseable date: %r\n' % (m.getheader('Date'),))
+        t = os.fstat(f.fileno())[stat.ST_MTIME]
+    print 'From', email, time.ctime(t)
+    # Copy RFC822 header
+    for line in m.headers:
+        print line,
+    # Invent Message-ID header if none is present
+    if not m.has_key('message-id'):
+        global counter
+        counter = counter + 1
+        msgid = "<%s.%d>" % (hex(t), counter)
+        sys.stderr.write("Adding Message-ID %s (From %s)\n" %
+                         (msgid, email))
+        print "Message-ID:", msgid
+    print
+    # Copy body
+    while 1:
+        line = f.readline()
+        if line == delimiter:
+            break
+        if not line:
+            sys.stderr.write('Unexpected EOF in message\n')
+            sts = 1
+            break
+        if line[:5] == 'From ':
+            line = '>' + line
+        print line,
+    # Print trailing newline
+    print
+    return sts
 
 main()
diff --git a/Demo/scripts/mkrcs.py b/Demo/scripts/mkrcs.py
index 917b4fe..45a68b9 100755
--- a/Demo/scripts/mkrcs.py
+++ b/Demo/scripts/mkrcs.py
@@ -9,52 +9,52 @@
 import os
 
 def main():
-	rcstree = 'RCStree'
-	rcs = 'RCS'
-	if os.path.islink(rcs):
-		print '%r is a symlink to %r' % (rcs, os.readlink(rcs))
-		return
-	if os.path.isdir(rcs):
-		print '%r is an ordinary directory' % (rcs,)
-		return
-	if os.path.exists(rcs):
-		print '%r is a file?!?!' % (rcs,)
-		return
-	#
-	p = os.getcwd()
-	up = ''
-	down = ''
-	# Invariants:
-	# (1) join(p, down) is the current directory
-	# (2) up is the same directory as p
-	# Ergo:
-	# (3) join(up, down) is the current directory
-	#print 'p =', repr(p)
-	while not os.path.isdir(os.path.join(p, rcstree)):
-		head, tail = os.path.split(p)
-		#print 'head = %r; tail = %r' % (head, tail)
-		if not tail:
-			print 'Sorry, no ancestor dir contains %r' % (rcstree,)
-			return
-		p = head
-		up = os.path.join(os.pardir, up)
-		down = os.path.join(tail, down)
-		#print 'p = %r; up = %r; down = %r' % (p, up, down)
-	there = os.path.join(up, rcstree)
-	there = os.path.join(there, down)
-	there = os.path.join(there, rcs)
-	if os.path.isdir(there):
-		print '%r already exists' % (there, )
-	else:
-		print 'making %r' % (there,)
-		makedirs(there)
-	print 'making symlink %r -> %r' % (rcs, there)
-	os.symlink(there, rcs)
+    rcstree = 'RCStree'
+    rcs = 'RCS'
+    if os.path.islink(rcs):
+        print '%r is a symlink to %r' % (rcs, os.readlink(rcs))
+        return
+    if os.path.isdir(rcs):
+        print '%r is an ordinary directory' % (rcs,)
+        return
+    if os.path.exists(rcs):
+        print '%r is a file?!?!' % (rcs,)
+        return
+    #
+    p = os.getcwd()
+    up = ''
+    down = ''
+    # Invariants:
+    # (1) join(p, down) is the current directory
+    # (2) up is the same directory as p
+    # Ergo:
+    # (3) join(up, down) is the current directory
+    #print 'p =', repr(p)
+    while not os.path.isdir(os.path.join(p, rcstree)):
+        head, tail = os.path.split(p)
+        #print 'head = %r; tail = %r' % (head, tail)
+        if not tail:
+            print 'Sorry, no ancestor dir contains %r' % (rcstree,)
+            return
+        p = head
+        up = os.path.join(os.pardir, up)
+        down = os.path.join(tail, down)
+        #print 'p = %r; up = %r; down = %r' % (p, up, down)
+    there = os.path.join(up, rcstree)
+    there = os.path.join(there, down)
+    there = os.path.join(there, rcs)
+    if os.path.isdir(there):
+        print '%r already exists' % (there, )
+    else:
+        print 'making %r' % (there,)
+        makedirs(there)
+    print 'making symlink %r -> %r' % (rcs, there)
+    os.symlink(there, rcs)
 
 def makedirs(p):
-	if not os.path.isdir(p):
-		head, tail = os.path.split(p)
-		makedirs(head)
-		os.mkdir(p, 0777)
+    if not os.path.isdir(p):
+        head, tail = os.path.split(p)
+        makedirs(head)
+        os.mkdir(p, 0777)
 
 main()
diff --git a/Demo/scripts/morse.py b/Demo/scripts/morse.py
index 2cea83e..3da49da 100755
--- a/Demo/scripts/morse.py
+++ b/Demo/scripts/morse.py
@@ -7,57 +7,57 @@
 
 DOT = 30
 DAH = 3 * DOT
-OCTAVE = 2				# 1 == 441 Hz, 2 == 882 Hz, ...
+OCTAVE = 2                              # 1 == 441 Hz, 2 == 882 Hz, ...
 
 morsetab = {
-	'A': '.-',		'a': '.-',
-	'B': '-...',		'b': '-...',
-	'C': '-.-.',		'c': '-.-.',
-	'D': '-..',		'd': '-..',
-	'E': '.',		'e': '.',
-	'F': '..-.',		'f': '..-.',
-	'G': '--.',		'g': '--.',
-	'H': '....',		'h': '....',
-	'I': '..',		'i': '..',
-	'J': '.---',		'j': '.---',
-	'K': '-.-',		'k': '-.-',
-	'L': '.-..',		'l': '.-..',
-	'M': '--',		'm': '--',
-	'N': '-.',		'n': '-.',
-	'O': '---',		'o': '---',
-	'P': '.--.',		'p': '.--.',
-	'Q': '--.-',		'q': '--.-',
-	'R': '.-.',		'r': '.-.',
-	'S': '...',		's': '...',
-	'T': '-',		't': '-',
-	'U': '..-',		'u': '..-',
-	'V': '...-',		'v': '...-',
-	'W': '.--',		'w': '.--',
-	'X': '-..-',		'x': '-..-',
-	'Y': '-.--',		'y': '-.--',
-	'Z': '--..',		'z': '--..',
-	'0': '-----',
-	'1': '.----',
-	'2': '..---',
-	'3': '...--',
-	'4': '....-',
-	'5': '.....',
-	'6': '-....',
-	'7': '--...',
-	'8': '---..',
-	'9': '----.',
-	',': '--..--',
-	'.': '.-.-.-',
-	'?': '..--..',
-	';': '-.-.-.',
-	':': '---...',
-	"'": '.----.',
-	'-': '-....-',
-	'/': '-..-.',
-	'(': '-.--.-',
-	')': '-.--.-',
-	'_': '..--.-',
-	' ': ' '
+        'A': '.-',              'a': '.-',
+        'B': '-...',            'b': '-...',
+        'C': '-.-.',            'c': '-.-.',
+        'D': '-..',             'd': '-..',
+        'E': '.',               'e': '.',
+        'F': '..-.',            'f': '..-.',
+        'G': '--.',             'g': '--.',
+        'H': '....',            'h': '....',
+        'I': '..',              'i': '..',
+        'J': '.---',            'j': '.---',
+        'K': '-.-',             'k': '-.-',
+        'L': '.-..',            'l': '.-..',
+        'M': '--',              'm': '--',
+        'N': '-.',              'n': '-.',
+        'O': '---',             'o': '---',
+        'P': '.--.',            'p': '.--.',
+        'Q': '--.-',            'q': '--.-',
+        'R': '.-.',             'r': '.-.',
+        'S': '...',             's': '...',
+        'T': '-',               't': '-',
+        'U': '..-',             'u': '..-',
+        'V': '...-',            'v': '...-',
+        'W': '.--',             'w': '.--',
+        'X': '-..-',            'x': '-..-',
+        'Y': '-.--',            'y': '-.--',
+        'Z': '--..',            'z': '--..',
+        '0': '-----',
+        '1': '.----',
+        '2': '..---',
+        '3': '...--',
+        '4': '....-',
+        '5': '.....',
+        '6': '-....',
+        '7': '--...',
+        '8': '---..',
+        '9': '----.',
+        ',': '--..--',
+        '.': '.-.-.-',
+        '?': '..--..',
+        ';': '-.-.-.',
+        ':': '---...',
+        "'": '.----.',
+        '-': '-....-',
+        '/': '-..-.',
+        '(': '-.--.-',
+        ')': '-.--.-',
+        '_': '..--.-',
+        ' ': ' '
 }
 
 # If we play at 44.1 kHz (which we do), then if we produce one sine
@@ -65,85 +65,85 @@
 # sine waves in these 100 samples, we get a tone of 882 Hz.  882 Hz
 # appears to be a nice one for playing morse code.
 def mkwave(octave):
-	global sinewave, nowave
-	sinewave = ''
-	for i in range(100):
-		val = int(math.sin(math.pi * float(i) * octave / 50.0) * 30000)
-		sinewave = sinewave + chr((val >> 8) & 255) + chr(val & 255)
-	nowave = '\0' * 200
+    global sinewave, nowave
+    sinewave = ''
+    for i in range(100):
+        val = int(math.sin(math.pi * float(i) * octave / 50.0) * 30000)
+        sinewave = sinewave + chr((val >> 8) & 255) + chr(val & 255)
+    nowave = '\0' * 200
 
 mkwave(OCTAVE)
 
 def main():
-	import getopt, string
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], 'o:p:')
-	except getopt.error:
-		sys.stderr.write('Usage ' + sys.argv[0] +
-				 ' [ -o outfile ] [ args ] ...\n')
-		sys.exit(1)
-	dev = None
-	for o, a in opts:
-		if o == '-o':
-			import aifc
-			dev = aifc.open(a, 'w')
-			dev.setframerate(44100)
-			dev.setsampwidth(2)
-			dev.setnchannels(1)
-		if o == '-p':
-			mkwave(string.atoi(a))
-	if not dev:
-		import audiodev
-		dev = audiodev.AudioDev()
-		dev.setoutrate(44100)
-		dev.setsampwidth(2)
-		dev.setnchannels(1)
-		dev.close = dev.stop
-		dev.writeframesraw = dev.writeframes
-	if args:
-		line = string.join(args)
-	else:
-		line = sys.stdin.readline()
-	while line:
-		mline = morse(line)
-		play(mline, dev)
-		if hasattr(dev, 'wait'):
-			dev.wait()
-		if not args:
-			line = sys.stdin.readline()
-		else:
-			line = ''
-	dev.close()
+    import getopt, string
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], 'o:p:')
+    except getopt.error:
+        sys.stderr.write('Usage ' + sys.argv[0] +
+                         ' [ -o outfile ] [ args ] ...\n')
+        sys.exit(1)
+    dev = None
+    for o, a in opts:
+        if o == '-o':
+            import aifc
+            dev = aifc.open(a, 'w')
+            dev.setframerate(44100)
+            dev.setsampwidth(2)
+            dev.setnchannels(1)
+        if o == '-p':
+            mkwave(string.atoi(a))
+    if not dev:
+        import audiodev
+        dev = audiodev.AudioDev()
+        dev.setoutrate(44100)
+        dev.setsampwidth(2)
+        dev.setnchannels(1)
+        dev.close = dev.stop
+        dev.writeframesraw = dev.writeframes
+    if args:
+        line = string.join(args)
+    else:
+        line = sys.stdin.readline()
+    while line:
+        mline = morse(line)
+        play(mline, dev)
+        if hasattr(dev, 'wait'):
+            dev.wait()
+        if not args:
+            line = sys.stdin.readline()
+        else:
+            line = ''
+    dev.close()
 
 # Convert a string to morse code with \001 between the characters in
 # the string.
 def morse(line):
-	res = ''
-	for c in line:
-		try:
-			res = res + morsetab[c] + '\001'
-		except KeyError:
-			pass
-	return res
+    res = ''
+    for c in line:
+        try:
+            res = res + morsetab[c] + '\001'
+        except KeyError:
+            pass
+    return res
 
 # Play a line of morse code.
 def play(line, dev):
-	for c in line:
-		if c == '.':
-			sine(dev, DOT)
-		elif c == '-':
-			sine(dev, DAH)
-		else:			# space
-			pause(dev, DAH + DOT)
-		pause(dev, DOT)
+    for c in line:
+        if c == '.':
+            sine(dev, DOT)
+        elif c == '-':
+            sine(dev, DAH)
+        else:                   # space
+            pause(dev, DAH + DOT)
+        pause(dev, DOT)
 
 def sine(dev, length):
-	for i in range(length):
-		dev.writeframesraw(sinewave)
+    for i in range(length):
+        dev.writeframesraw(sinewave)
 
 def pause(dev, length):
-	for i in range(length):
-		dev.writeframesraw(nowave)
+    for i in range(length):
+        dev.writeframesraw(nowave)
 
 if __name__ == '__main__' or sys.argv[0] == __name__:
-	main()
+    main()
diff --git a/Demo/scripts/mpzpi.py b/Demo/scripts/mpzpi.py
index ccf591d..70b1a51 100755
--- a/Demo/scripts/mpzpi.py
+++ b/Demo/scripts/mpzpi.py
@@ -11,24 +11,24 @@
 from mpz import mpz
 
 def main():
-	mpzone, mpztwo, mpzten = mpz(1), mpz(2), mpz(10)
-	k, a, b, a1, b1 = mpz(2), mpz(4), mpz(1), mpz(12), mpz(4)
-	while 1:
-		# Next approximation
-		p, q, k = k*k, mpztwo*k+mpzone, k+mpzone
-		a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
-		# Print common digits
-		d, d1 = a/b, a1/b1
-		while d == d1:
-			output(d)
-			a, a1 = mpzten*(a%b), mpzten*(a1%b1)
-			d, d1 = a/b, a1/b1
+    mpzone, mpztwo, mpzten = mpz(1), mpz(2), mpz(10)
+    k, a, b, a1, b1 = mpz(2), mpz(4), mpz(1), mpz(12), mpz(4)
+    while 1:
+        # Next approximation
+        p, q, k = k*k, mpztwo*k+mpzone, k+mpzone
+        a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
+        # Print common digits
+        d, d1 = a/b, a1/b1
+        while d == d1:
+            output(d)
+            a, a1 = mpzten*(a%b), mpzten*(a1%b1)
+            d, d1 = a/b, a1/b1
 
 def output(d):
-	# Use write() to avoid spaces between the digits
-	# Use int(d) to avoid a trailing L after each digit
-	sys.stdout.write(repr(int(d)))
-	# Flush so the output is seen immediately
-	sys.stdout.flush()
+    # Use write() to avoid spaces between the digits
+    # Use int(d) to avoid a trailing L after each digit
+    sys.stdout.write(repr(int(d)))
+    # Flush so the output is seen immediately
+    sys.stdout.flush()
 
 main()
diff --git a/Demo/scripts/newslist.py b/Demo/scripts/newslist.py
index b06b452..b9f9c0e 100755
--- a/Demo/scripts/newslist.py
+++ b/Demo/scripts/newslist.py
@@ -5,27 +5,27 @@
 # Syntax:
 #    newslist [ -a ]
 #
-# This is a program to create a directory full of HTML pages 
+# This is a program to create a directory full of HTML pages
 # which between them contain links to all the newsgroups available
 # on your server.
 #
-# The -a option causes a complete list of all groups to be read from 
+# The -a option causes a complete list of all groups to be read from
 # the server rather than just the ones which have appeared since last
 # execution. This recreates the local list from scratch. Use this on
 # the first invocation of the program, and from time to time thereafter.
-#   When new groups are first created they may appear on your server as 
+#   When new groups are first created they may appear on your server as
 # empty groups. By default, empty groups are ignored by the -a option.
 # However, these new groups will not be created again, and so will not
 # appear in the server's list of 'new groups' at a later date. Hence it
 # won't appear until you do a '-a' after some articles have appeared.
-# 
+#
 # I should really keep a list of ignored empty groups and re-check them
 # for articles on every run, but I haven't got around to it yet.
 #
 # This assumes an NNTP news feed.
 #
-# Feel free to copy, distribute and modify this code for 
-# non-commercial use. If you make any useful modifications, let me 
+# Feel free to copy, distribute and modify this code for
+# non-commercial use. If you make any useful modifications, let me
 # know!
 #
 # (c) Quentin Stafford-Fraser 1994
@@ -42,9 +42,9 @@
 topdir='/anfs/qsbigdisc/web/html/newspage'
 
 # The name of your NNTP host
-# eg. 
+# eg.
 #    newshost = 'nntp-serv.cl.cam.ac.uk'
-# or use following to get the name from the NNTPSERVER environment 
+# or use following to get the name from the NNTPSERVER environment
 # variable:
 #    newshost = posix.environ['NNTPSERVER']
 newshost = 'nntp-serv.cl.cam.ac.uk'
@@ -60,17 +60,17 @@
 # The directory in which HTML pages should be created
 # eg.
 #   pagedir  = '/usr/local/lib/html/newspage'
-#   pagedir  = 'pages' 
+#   pagedir  = 'pages'
 pagedir  = topdir
 
 # The html prefix which will refer to this directory
-# eg. 
-#   httppref = '/newspage/', 
+# eg.
+#   httppref = '/newspage/',
 # or leave blank for relative links between pages: (Recommended)
 #   httppref = ''
 httppref = ''
 
-# The name of the 'root' news page in this directory. 
+# The name of the 'root' news page in this directory.
 # A .html suffix will be added.
 rootpage = 'root'
 
@@ -88,7 +88,7 @@
 
 # Sublistsize controls the maximum number of items the will appear as
 # an indented sub-list before the whole thing is moved onto a different
-# page. The smaller this is, the more pages you will have, but the 
+# page. The smaller this is, the more pages you will have, but the
 # shorter each will be.
 sublistsize = 4
 
@@ -118,246 +118,246 @@
 
 # Addtotree creates/augments a tree from a list of group names
 def addtotree(tree, groups):
-   print 'Updating tree...'
-   for i in groups:
+    print 'Updating tree...'
+    for i in groups:
         parts = string.splitfields(i,'.')
         makeleaf(tree, parts)
 
 # Makeleaf makes a leaf and the branch leading to it if necessary
 def makeleaf(tree,path):
-   j = path[0]
-   l = len(path)
+    j = path[0]
+    l = len(path)
 
-   if not tree.has_key(j):
-      tree[j] = {}
-   if l == 1:
-      tree[j]['.'] = '.'
-   if l > 1:
-      makeleaf(tree[j],path[1:])
+    if not tree.has_key(j):
+        tree[j] = {}
+    if l == 1:
+        tree[j]['.'] = '.'
+    if l > 1:
+        makeleaf(tree[j],path[1:])
 
-# Then the bits for outputting trees as pages ----------------  
+# Then the bits for outputting trees as pages ----------------
 
 # Createpage creates an HTML file named <root>.html containing links
 # to those groups beginning with <root>.
 
 def createpage(root, tree, p):
-   filename = os.path.join(pagedir,root+'.html')
-   if root == rootpage:
-      detail = ''
-   else:
-      detail = ' under ' + root
-   f = open(filename,'w')
-   # f.write('Content-Type: text/html\n')
-   f.write('<TITLE>Newsgroups available' + detail + '</TITLE>\n')
-   f.write('<H1>Newsgroups available' + detail +'</H1>\n')
-   f.write('<A HREF="'+httppref+rootpage+'.html">Back to top level</A><P>\n')
-   printtree(f,tree,0,p)
-   f.write('<I>This page automatically created by \'newslist\' v. '+rcsrev+'.')
-   f.write(time.ctime(time.time()) + '</I><P>')
-   f.close()
+    filename = os.path.join(pagedir,root+'.html')
+    if root == rootpage:
+        detail = ''
+    else:
+        detail = ' under ' + root
+    f = open(filename,'w')
+    # f.write('Content-Type: text/html\n')
+    f.write('<TITLE>Newsgroups available' + detail + '</TITLE>\n')
+    f.write('<H1>Newsgroups available' + detail +'</H1>\n')
+    f.write('<A HREF="'+httppref+rootpage+'.html">Back to top level</A><P>\n')
+    printtree(f,tree,0,p)
+    f.write('<I>This page automatically created by \'newslist\' v. '+rcsrev+'.')
+    f.write(time.ctime(time.time()) + '</I><P>')
+    f.close()
 
 # Printtree prints the groups as a bulleted list.  Groups with
 # more than <sublistsize> subgroups will be put on a separate page.
 # Other sets of subgroups are just indented.
 
 def printtree(f, tree, indent, p):
-   global desc
-   l = len(tree)
+    global desc
+    l = len(tree)
 
-   if l > sublistsize and indent>0:
-      # Create a new page and a link to it
-      f.write('<LI><B><A HREF="'+httppref+p[1:]+'.html">')
-      f.write(p[1:]+'.*')
-      f.write('</A></B>'+pagelinkicon+'\n')
-      createpage(p[1:], tree, p)
-      return
+    if l > sublistsize and indent>0:
+        # Create a new page and a link to it
+        f.write('<LI><B><A HREF="'+httppref+p[1:]+'.html">')
+        f.write(p[1:]+'.*')
+        f.write('</A></B>'+pagelinkicon+'\n')
+        createpage(p[1:], tree, p)
+        return
 
-   kl = tree.keys()
+    kl = tree.keys()
 
-   if l > 1:
-      kl.sort()
-      if indent > 0:
-         # Create a sub-list
-         f.write('<LI>'+p[1:]+'\n<UL>')
-      else:
-         # Create a main list
-         f.write('<UL>')
-      indent = indent + 1
-   
-   for i in kl:
-      if i == '.':
-         # Output a newsgroup
-         f.write('<LI><A HREF="news:' + p[1:] + '">'+ p[1:] + '</A> ')
-         if desc.has_key(p[1:]):
-            f.write('     <I>'+desc[p[1:]]+'</I>\n')
-         else:
-            f.write('\n')
-      else:
-         # Output a hierarchy
-         printtree(f,tree[i], indent, p+'.'+i)
+    if l > 1:
+        kl.sort()
+        if indent > 0:
+            # Create a sub-list
+            f.write('<LI>'+p[1:]+'\n<UL>')
+        else:
+            # Create a main list
+            f.write('<UL>')
+        indent = indent + 1
 
-   if l > 1:
-      f.write('\n</UL>')
+    for i in kl:
+        if i == '.':
+            # Output a newsgroup
+            f.write('<LI><A HREF="news:' + p[1:] + '">'+ p[1:] + '</A> ')
+            if desc.has_key(p[1:]):
+                f.write('     <I>'+desc[p[1:]]+'</I>\n')
+            else:
+                f.write('\n')
+        else:
+            # Output a hierarchy
+            printtree(f,tree[i], indent, p+'.'+i)
+
+    if l > 1:
+        f.write('\n</UL>')
 
 # Reading descriptions file ---------------------------------------
 
 # This returns an array mapping group name to its description
 
 def readdesc(descfile):
-   global desc
+    global desc
 
-   desc = {}
+    desc = {}
 
-   if descfile == '':
+    if descfile == '':
         return
 
-   try:
-      d = open(descfile, 'r')
-      print 'Reading descriptions...'
-   except (IOError):
-      print 'Failed to open description file ' + descfile
-      return
-   l = d.readline()
-   while l != '':
-      bits = string.split(l)
-      try:
-         grp = bits[0]
-         dsc = string.join(bits[1:])
-         if len(dsc)>1:
-            desc[grp] = dsc
-      except (IndexError):
-         pass
-      l = d.readline()
+    try:
+        d = open(descfile, 'r')
+        print 'Reading descriptions...'
+    except (IOError):
+        print 'Failed to open description file ' + descfile
+        return
+    l = d.readline()
+    while l != '':
+        bits = string.split(l)
+        try:
+            grp = bits[0]
+            dsc = string.join(bits[1:])
+            if len(dsc)>1:
+                desc[grp] = dsc
+        except (IndexError):
+            pass
+        l = d.readline()
 
 # Check that ouput directory exists, ------------------------------
 # and offer to create it if not
 
 def checkopdir(pagedir):
-   if not os.path.isdir(pagedir):
-      print 'Directory '+pagedir+' does not exist.'
-      print 'Shall I create it for you? (y/n)'
-      if sys.stdin.readline()[0] == 'y':
-         try:
-            os.mkdir(pagedir,0777)
-         except:
-            print 'Sorry - failed!'
+    if not os.path.isdir(pagedir):
+        print 'Directory '+pagedir+' does not exist.'
+        print 'Shall I create it for you? (y/n)'
+        if sys.stdin.readline()[0] == 'y':
+            try:
+                os.mkdir(pagedir,0777)
+            except:
+                print 'Sorry - failed!'
+                sys.exit(1)
+        else:
+            print 'OK. Exiting.'
             sys.exit(1)
-      else:
-         print 'OK. Exiting.'
-         sys.exit(1)
 
 # Read and write current local tree ----------------------------------
 
 def readlocallist(treefile):
-      print 'Reading current local group list...'
-      tree = {}
-      try:
-         treetime = time.localtime(os.stat(treefile)[ST_MTIME])
-      except:
-         print '\n*** Failed to open local group cache '+treefile
-         print 'If this is the first time you have run newslist, then'
-         print 'use the -a option to create it.'
-         sys.exit(1)
-      treedate = '%02d%02d%02d' % (treetime[0] % 100 ,treetime[1], treetime[2])
-      try:
-         dump = open(treefile,'r')
-         tree = marshal.load(dump)
-         dump.close()
-      except (IOError):
-         print 'Cannot open local group list ' + treefile
-      return (tree, treedate)
+    print 'Reading current local group list...'
+    tree = {}
+    try:
+        treetime = time.localtime(os.stat(treefile)[ST_MTIME])
+    except:
+        print '\n*** Failed to open local group cache '+treefile
+        print 'If this is the first time you have run newslist, then'
+        print 'use the -a option to create it.'
+        sys.exit(1)
+    treedate = '%02d%02d%02d' % (treetime[0] % 100 ,treetime[1], treetime[2])
+    try:
+        dump = open(treefile,'r')
+        tree = marshal.load(dump)
+        dump.close()
+    except (IOError):
+        print 'Cannot open local group list ' + treefile
+    return (tree, treedate)
 
 def writelocallist(treefile, tree):
-   try:
-      dump = open(treefile,'w')
-      groups = marshal.dump(tree,dump)
-      dump.close()
-      print 'Saved list to '+treefile+'\n'
-   except:
-      print 'Sorry - failed to write to local group cache '+treefile
-      print 'Does it (or its directory) have the correct permissions?'
-      sys.exit(1)
+    try:
+        dump = open(treefile,'w')
+        groups = marshal.dump(tree,dump)
+        dump.close()
+        print 'Saved list to '+treefile+'\n'
+    except:
+        print 'Sorry - failed to write to local group cache '+treefile
+        print 'Does it (or its directory) have the correct permissions?'
+        sys.exit(1)
 
 # Return list of all groups on server -----------------------------
 
 def getallgroups(server):
-   print 'Getting list of all groups...'
-   treedate='010101'
-   info = server.list()[1]
-   groups = []
-   print 'Processing...'
-   if skipempty:
-      print '\nIgnoring following empty groups:'
-   for i in info:
-      grpname = string.split(i[0])[0]
-      if skipempty and string.atoi(i[1]) < string.atoi(i[2]):
-         print grpname+' ',
-      else:
-         groups.append(grpname)
-   print '\n'
-   if skipempty:
-      print '(End of empty groups)'
-   return groups
+    print 'Getting list of all groups...'
+    treedate='010101'
+    info = server.list()[1]
+    groups = []
+    print 'Processing...'
+    if skipempty:
+        print '\nIgnoring following empty groups:'
+    for i in info:
+        grpname = string.split(i[0])[0]
+        if skipempty and string.atoi(i[1]) < string.atoi(i[2]):
+            print grpname+' ',
+        else:
+            groups.append(grpname)
+    print '\n'
+    if skipempty:
+        print '(End of empty groups)'
+    return groups
 
 # Return list of new groups on server -----------------------------
 
 def getnewgroups(server, treedate):
-   print 'Getting list of new groups since start of '+treedate+'...',
-   info = server.newgroups(treedate,'000001')[1]
-   print 'got %d.' % len(info)
-   print 'Processing...',
-   groups = []
-   for i in info:
-      grpname = string.split(i)[0]
-      groups.append(grpname)
-   print 'Done'
-   return groups
+    print 'Getting list of new groups since start of '+treedate+'...',
+    info = server.newgroups(treedate,'000001')[1]
+    print 'got %d.' % len(info)
+    print 'Processing...',
+    groups = []
+    for i in info:
+        grpname = string.split(i)[0]
+        groups.append(grpname)
+    print 'Done'
+    return groups
 
 # Now the main program --------------------------------------------
 
 def main():
-   global desc
+    global desc
 
-   tree={}
+    tree={}
 
-   # Check that the output directory exists
-   checkopdir(pagedir);
+    # Check that the output directory exists
+    checkopdir(pagedir);
 
-   try:
-      print 'Connecting to '+newshost+'...'
-      if sys.version[0] == '0':
-         s = NNTP.init(newshost)
-      else:
-         s = NNTP(newshost)
-      connected = 1
-   except (nntplib.error_temp, nntplib.error_perm), x:
-      print 'Error connecting to host:', x
-      print 'I\'ll try to use just the local list.'
-      connected = 0
+    try:
+        print 'Connecting to '+newshost+'...'
+        if sys.version[0] == '0':
+            s = NNTP.init(newshost)
+        else:
+            s = NNTP(newshost)
+        connected = 1
+    except (nntplib.error_temp, nntplib.error_perm), x:
+        print 'Error connecting to host:', x
+        print 'I\'ll try to use just the local list.'
+        connected = 0
 
-   # If -a is specified, read the full list of groups from server   
-   if connected and len(sys.argv) > 1 and sys.argv[1] == '-a':
+    # If -a is specified, read the full list of groups from server
+    if connected and len(sys.argv) > 1 and sys.argv[1] == '-a':
 
-     groups = getallgroups(s)
+        groups = getallgroups(s)
 
-   # Otherwise just read the local file and then add
-   # groups created since local file last modified.
-   else:
+    # Otherwise just read the local file and then add
+    # groups created since local file last modified.
+    else:
 
-      (tree, treedate) = readlocallist(treefile)
-      if connected:
-         groups = getnewgroups(s, treedate)
-      
-   if connected:
-      addtotree(tree, groups)
-      writelocallist(treefile,tree)
+        (tree, treedate) = readlocallist(treefile)
+        if connected:
+            groups = getnewgroups(s, treedate)
 
-   # Read group descriptions
-   readdesc(descfile)
+    if connected:
+        addtotree(tree, groups)
+        writelocallist(treefile,tree)
 
-   print 'Creating pages...'
-   createpage(rootpage, tree, '')
-   print 'Done'
+    # Read group descriptions
+    readdesc(descfile)
+
+    print 'Creating pages...'
+    createpage(rootpage, tree, '')
+    print 'Done'
 
 
 main()
diff --git a/Demo/scripts/pp.py b/Demo/scripts/pp.py
index 92a1104..0491fa9 100755
--- a/Demo/scripts/pp.py
+++ b/Demo/scripts/pp.py
@@ -34,89 +34,89 @@
 PFLAG = 0
 
 try:
-	optlist, ARGS = getopt.getopt(sys.argv[1:], 'acde:F:np')
+    optlist, ARGS = getopt.getopt(sys.argv[1:], 'acde:F:np')
 except getopt.error, msg:
-	sys.stderr.write(sys.argv[0] + ': ' + msg + '\n')
-	sys.exit(2)
+    sys.stderr.write(sys.argv[0] + ': ' + msg + '\n')
+    sys.exit(2)
 
 for option, optarg in optlist:
-	if option == '-a':
-		AFLAG = 1
-	elif option == '-c':
-		CFLAG = 1
-	elif option == '-d':
-		DFLAG = 1
-	elif option == '-e':
-		for line in string.splitfields(optarg, '\n'):
-			SCRIPT.append(line)
-	elif option == '-F':
-		FS = optarg
-	elif option == '-n':
-		NFLAG = 1
-		PFLAG = 0
-	elif option == '-p':
-		NFLAG = 1
-		PFLAG = 1
-	else:
-		print option, 'not recognized???'
+    if option == '-a':
+        AFLAG = 1
+    elif option == '-c':
+        CFLAG = 1
+    elif option == '-d':
+        DFLAG = 1
+    elif option == '-e':
+        for line in string.splitfields(optarg, '\n'):
+            SCRIPT.append(line)
+    elif option == '-F':
+        FS = optarg
+    elif option == '-n':
+        NFLAG = 1
+        PFLAG = 0
+    elif option == '-p':
+        NFLAG = 1
+        PFLAG = 1
+    else:
+        print option, 'not recognized???'
 
 if not ARGS: ARGS.append('-')
 
 if not SCRIPT:
-	if ARGS[0] == '-':
-		fp = sys.stdin
-	else:
-		fp = open(ARGS[0], 'r')
-	while 1:
-		line = fp.readline()
-		if not line: break
-		SCRIPT.append(line[:-1])
-	del fp
-	del ARGS[0]
-	if not ARGS: ARGS.append('-')
+    if ARGS[0] == '-':
+        fp = sys.stdin
+    else:
+        fp = open(ARGS[0], 'r')
+    while 1:
+        line = fp.readline()
+        if not line: break
+        SCRIPT.append(line[:-1])
+    del fp
+    del ARGS[0]
+    if not ARGS: ARGS.append('-')
 
 if CFLAG:
-	prologue = ['if 0:']
-	epilogue = []
+    prologue = ['if 0:']
+    epilogue = []
 elif NFLAG:
-	# Note that it is on purpose that AFLAG and PFLAG are
-	# tested dynamically each time through the loop
-	prologue = [ \
-		'LINECOUNT = 0', \
-		'for FILE in ARGS:', \
-		'   \tif FILE == \'-\':', \
-		'   \t   \tFP = sys.stdin', \
-		'   \telse:', \
-		'   \t   \tFP = open(FILE, \'r\')', \
-		'   \tLINENO = 0', \
-		'   \twhile 1:', \
-		'   \t   \tLINE = FP.readline()', \
-		'   \t   \tif not LINE: break', \
-		'   \t   \tLINENO = LINENO + 1', \
-		'   \t   \tLINECOUNT = LINECOUNT + 1', \
-		'   \t   \tL = LINE[:-1]', \
-		'   \t   \taflag = AFLAG', \
-		'   \t   \tif aflag:', \
-		'   \t   \t   \tif FS: F = string.splitfields(L, FS)', \
-		'   \t   \t   \telse: F = string.split(L)' \
-		]
-	epilogue = [ \
-		'   \t   \tif not PFLAG: continue', \
-		'   \t   \tif aflag:', \
-		'   \t   \t   \tif FS: print string.joinfields(F, FS)', \
-		'   \t   \t   \telse: print string.join(F)', \
-		'   \t   \telse: print L', \
-		]
+    # Note that it is on purpose that AFLAG and PFLAG are
+    # tested dynamically each time through the loop
+    prologue = [ \
+            'LINECOUNT = 0', \
+            'for FILE in ARGS:', \
+            '   \tif FILE == \'-\':', \
+            '   \t   \tFP = sys.stdin', \
+            '   \telse:', \
+            '   \t   \tFP = open(FILE, \'r\')', \
+            '   \tLINENO = 0', \
+            '   \twhile 1:', \
+            '   \t   \tLINE = FP.readline()', \
+            '   \t   \tif not LINE: break', \
+            '   \t   \tLINENO = LINENO + 1', \
+            '   \t   \tLINECOUNT = LINECOUNT + 1', \
+            '   \t   \tL = LINE[:-1]', \
+            '   \t   \taflag = AFLAG', \
+            '   \t   \tif aflag:', \
+            '   \t   \t   \tif FS: F = string.splitfields(L, FS)', \
+            '   \t   \t   \telse: F = string.split(L)' \
+            ]
+    epilogue = [ \
+            '   \t   \tif not PFLAG: continue', \
+            '   \t   \tif aflag:', \
+            '   \t   \t   \tif FS: print string.joinfields(F, FS)', \
+            '   \t   \t   \telse: print string.join(F)', \
+            '   \t   \telse: print L', \
+            ]
 else:
-	prologue = ['if 1:']
-	epilogue = []
+    prologue = ['if 1:']
+    epilogue = []
 
 # Note that we indent using tabs only, so that any indentation style
 # used in 'command' will come out right after re-indentation.
 
 program = string.joinfields(prologue, '\n') + '\n'
 for line in SCRIPT:
-	program = program + ('   \t   \t' + line + '\n')
+    program = program + ('   \t   \t' + line + '\n')
 program = program + (string.joinfields(epilogue, '\n') + '\n')
 
 import tempfile
@@ -124,7 +124,7 @@
 fp.write(program)
 fp.flush()
 if DFLAG:
-	import pdb
-	pdb.run('execfile(%r)' % (tfn,))
+    import pdb
+    pdb.run('execfile(%r)' % (tfn,))
 else:
-	execfile(tfn)
+    execfile(tfn)
diff --git a/Demo/scripts/primes.py b/Demo/scripts/primes.py
index 477c57b..00eb05f 100755
--- a/Demo/scripts/primes.py
+++ b/Demo/scripts/primes.py
@@ -3,24 +3,24 @@
 # Print prime numbers in a given range
 
 def main():
-	import sys
-	min, max = 2, 0x7fffffff
-	if sys.argv[1:]:
-		min = int(eval(sys.argv[1]))
-		if sys.argv[2:]:
-			max = int(eval(sys.argv[2]))
-	primes(min, max)
+    import sys
+    min, max = 2, 0x7fffffff
+    if sys.argv[1:]:
+        min = int(eval(sys.argv[1]))
+        if sys.argv[2:]:
+            max = int(eval(sys.argv[2]))
+    primes(min, max)
 
 def primes(min, max):
-	if 2 >= min: print 2
-	primes = [2]
-	i = 3
-	while i <= max:
-		for p in primes:
-			if i%p == 0 or p*p > i: break
-		if i%p <> 0:
-			primes.append(i)
-			if i >= min: print i
-		i = i+2
+    if 2 >= min: print 2
+    primes = [2]
+    i = 3
+    while i <= max:
+        for p in primes:
+            if i%p == 0 or p*p > i: break
+        if i%p <> 0:
+            primes.append(i)
+            if i >= min: print i
+        i = i+2
 
 main()
diff --git a/Demo/scripts/script.py b/Demo/scripts/script.py
index cbad367..6eaa7ae 100755
--- a/Demo/scripts/script.py
+++ b/Demo/scripts/script.py
@@ -1,8 +1,8 @@
 #! /usr/bin/env python
 # script.py -- Make typescript of terminal session.
 # Usage:
-#	-a	Append to typescript.
-#	-p	Use Python as shell.
+#       -a      Append to typescript.
+#       -p      Use Python as shell.
 # Author: Steen Lumholt.
 
 
@@ -10,19 +10,19 @@
 import pty
 
 def read(fd):
-	data = os.read(fd, 1024)
-	file.write(data)
-	return data
+    data = os.read(fd, 1024)
+    file.write(data)
+    return data
 
 shell = 'sh'
 filename = 'typescript'
 mode = 'w'
 if os.environ.has_key('SHELL'):
-	shell = os.environ['SHELL']
+    shell = os.environ['SHELL']
 if '-a' in sys.argv:
-	mode = 'a'
+    mode = 'a'
 if '-p' in sys.argv:
-	shell = 'python'
+    shell = 'python'
 
 file = open(filename, mode)
 
diff --git a/Demo/scripts/update.py b/Demo/scripts/update.py
index 2db65dc..67a0783 100755
--- a/Demo/scripts/update.py
+++ b/Demo/scripts/update.py
@@ -4,7 +4,7 @@
 # The input file contains lines of the form <filename>:<lineno>:<text>,
 # meaning that the given line of the given file is to be replaced
 # by the given text.  This is useful for performing global substitutions
-# on grep output: 
+# on grep output:
 
 import os
 import sys
@@ -14,78 +14,78 @@
 prog = regex.compile(pat)
 
 class FileObj:
-	def __init__(self, filename):
-		self.filename = filename
-		self.changed = 0
-		try:
-			self.lines = open(filename, 'r').readlines()
-		except IOError, msg:
-			print '*** Can\'t open "%s":' % filename, msg
-			self.lines = None
-			return
-		print 'diffing', self.filename
+    def __init__(self, filename):
+        self.filename = filename
+        self.changed = 0
+        try:
+            self.lines = open(filename, 'r').readlines()
+        except IOError, msg:
+            print '*** Can\'t open "%s":' % filename, msg
+            self.lines = None
+            return
+        print 'diffing', self.filename
 
-	def finish(self):
-		if not self.changed:
-			print 'no changes to', self.filename
-			return
-		try:
-			os.rename(self.filename, self.filename + '~')
-			fp = open(self.filename, 'w')
-		except (os.error, IOError), msg:
-			print '*** Can\'t rewrite "%s":' % self.filename, msg
-			return
-		print 'writing', self.filename
-		for line in self.lines:
-			fp.write(line)
-		fp.close()
-		self.changed = 0
+    def finish(self):
+        if not self.changed:
+            print 'no changes to', self.filename
+            return
+        try:
+            os.rename(self.filename, self.filename + '~')
+            fp = open(self.filename, 'w')
+        except (os.error, IOError), msg:
+            print '*** Can\'t rewrite "%s":' % self.filename, msg
+            return
+        print 'writing', self.filename
+        for line in self.lines:
+            fp.write(line)
+        fp.close()
+        self.changed = 0
 
-	def process(self, lineno, rest):
-		if self.lines is None:
-			print '(not processed): %s:%s:%s' % (
-				  self.filename, lineno, rest),
-			return
-		i = eval(lineno) - 1
-		if not 0 <= i < len(self.lines):
-			print '*** Line number out of range: %s:%s:%s' % (
-				  self.filename, lineno, rest),
-			return
-		if self.lines[i] == rest:
-			print '(no change): %s:%s:%s' % (
-				  self.filename, lineno, rest),
-			return
-		if not self.changed:
-			self.changed = 1
-		print '%sc%s' % (lineno, lineno)
-		print '<', self.lines[i],
-		print '---'
-		self.lines[i] = rest
-		print '>', self.lines[i],
+    def process(self, lineno, rest):
+        if self.lines is None:
+            print '(not processed): %s:%s:%s' % (
+                      self.filename, lineno, rest),
+            return
+        i = eval(lineno) - 1
+        if not 0 <= i < len(self.lines):
+            print '*** Line number out of range: %s:%s:%s' % (
+                      self.filename, lineno, rest),
+            return
+        if self.lines[i] == rest:
+            print '(no change): %s:%s:%s' % (
+                      self.filename, lineno, rest),
+            return
+        if not self.changed:
+            self.changed = 1
+        print '%sc%s' % (lineno, lineno)
+        print '<', self.lines[i],
+        print '---'
+        self.lines[i] = rest
+        print '>', self.lines[i],
 
 def main():
-	if sys.argv[1:]:
-		try:
-			fp = open(sys.argv[1], 'r')
-		except IOError, msg:
-			print 'Can\'t open "%s":' % sys.argv[1], msg
-			sys.exit(1)
-	else:
-		fp = sys.stdin
-	curfile = None
-	while 1:
-		line = fp.readline()
-		if not line:
-			if curfile: curfile.finish()
-			break
-		n = prog.match(line)
-		if n < 0:
-			print 'Funny line:', line,
-			continue
-		filename, lineno = prog.group(1, 2)
-		if not curfile or filename <> curfile.filename:
-			if curfile: curfile.finish()
-			curfile = FileObj(filename)
-		curfile.process(lineno, line[n:])
+    if sys.argv[1:]:
+        try:
+            fp = open(sys.argv[1], 'r')
+        except IOError, msg:
+            print 'Can\'t open "%s":' % sys.argv[1], msg
+            sys.exit(1)
+    else:
+        fp = sys.stdin
+    curfile = None
+    while 1:
+        line = fp.readline()
+        if not line:
+            if curfile: curfile.finish()
+            break
+        n = prog.match(line)
+        if n < 0:
+            print 'Funny line:', line,
+            continue
+        filename, lineno = prog.group(1, 2)
+        if not curfile or filename <> curfile.filename:
+            if curfile: curfile.finish()
+            curfile = FileObj(filename)
+        curfile.process(lineno, line[n:])
 
 main()
diff --git a/Demo/sockets/broadcast.py b/Demo/sockets/broadcast.py
index 010162c..6d2b1e8 100755
--- a/Demo/sockets/broadcast.py
+++ b/Demo/sockets/broadcast.py
@@ -10,8 +10,6 @@
 s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
 
 while 1:
-	data = repr(time.time()) + '\n'
-	s.sendto(data, ('<broadcast>', MYPORT))
-	time.sleep(2)
-
-	
+    data = repr(time.time()) + '\n'
+    s.sendto(data, ('<broadcast>', MYPORT))
+    time.sleep(2)
diff --git a/Demo/sockets/echosvr.py b/Demo/sockets/echosvr.py
index a37f9c2..f8a9623 100755
--- a/Demo/sockets/echosvr.py
+++ b/Demo/sockets/echosvr.py
@@ -13,19 +13,19 @@
 BUFSIZE = 1024
 
 def main():
-	if len(sys.argv) > 1:
-		port = int(eval(sys.argv[1]))
-	else:
-		port = ECHO_PORT
-	s = socket(AF_INET, SOCK_STREAM)
-	s.bind(('', port))
-	s.listen(1)
-	conn, (remotehost, remoteport) = s.accept()
-	print 'connected by', remotehost, remoteport
-	while 1:
-		data = conn.recv(BUFSIZE)
-		if not data:
-			break
-		conn.send(data)
+    if len(sys.argv) > 1:
+        port = int(eval(sys.argv[1]))
+    else:
+        port = ECHO_PORT
+    s = socket(AF_INET, SOCK_STREAM)
+    s.bind(('', port))
+    s.listen(1)
+    conn, (remotehost, remoteport) = s.accept()
+    print 'connected by', remotehost, remoteport
+    while 1:
+        data = conn.recv(BUFSIZE)
+        if not data:
+            break
+        conn.send(data)
 
 main()
diff --git a/Demo/sockets/finger.py b/Demo/sockets/finger.py
index 0c2baed..e8b9ed2 100755
--- a/Demo/sockets/finger.py
+++ b/Demo/sockets/finger.py
@@ -22,35 +22,35 @@
 # Output goes directly to stdout (although this can be changed).
 #
 def finger(host, args):
-	s = socket(AF_INET, SOCK_STREAM)
-	s.connect((host, FINGER_PORT))
-	s.send(args + '\n')
-	while 1:
-		buf = s.recv(1024)
-		if not buf: break
-		sys.stdout.write(buf)
-	sys.stdout.flush()
+    s = socket(AF_INET, SOCK_STREAM)
+    s.connect((host, FINGER_PORT))
+    s.send(args + '\n')
+    while 1:
+        buf = s.recv(1024)
+        if not buf: break
+        sys.stdout.write(buf)
+    sys.stdout.flush()
 
 
 # Main function: argument parsing.
 #
 def main():
-	options = ''
-	i = 1
-	while i < len(sys.argv) and sys.argv[i][:1] == '-':
-		options = options + sys.argv[i] + ' '
-		i = i+1
-	args = sys.argv[i:]
-	if not args:
-		args = ['']
-	for arg in args:
-		if '@' in arg:
-			at = string.index(arg, '@')
-			host = arg[at+1:]
-			arg = arg[:at]
-		else:
-			host = ''
-		finger(host, options + arg)
+    options = ''
+    i = 1
+    while i < len(sys.argv) and sys.argv[i][:1] == '-':
+        options = options + sys.argv[i] + ' '
+        i = i+1
+    args = sys.argv[i:]
+    if not args:
+        args = ['']
+    for arg in args:
+        if '@' in arg:
+            at = string.index(arg, '@')
+            host = arg[at+1:]
+            arg = arg[:at]
+        else:
+            host = ''
+        finger(host, options + arg)
 
 
 # Call the main function.
diff --git a/Demo/sockets/ftp.py b/Demo/sockets/ftp.py
index 9e1d5a1..6e9282a 100755
--- a/Demo/sockets/ftp.py
+++ b/Demo/sockets/ftp.py
@@ -37,35 +37,35 @@
 # Main program (called at the end of this file).
 #
 def main():
-	hostname = sys.argv[1]
-	control(hostname)
+    hostname = sys.argv[1]
+    control(hostname)
 
 
 # Control process (user interface and user protocol interpreter).
 #
 def control(hostname):
-	#
-	# Create control connection
-	#
-	s = socket(AF_INET, SOCK_STREAM)
-	s.connect((hostname, FTP_PORT))
-	f = s.makefile('r') # Reading the replies is easier from a file...
-	#
-	# Control loop
-	#
-	r = None
-	while 1:
-		code = getreply(f)
-		if code in ('221', 'EOF'): break
-		if code == '150':
-			getdata(r)
-			code = getreply(f)
-			r = None
-		if not r:
-			r = newdataport(s, f)
-		cmd = getcommand()
-		if not cmd: break
-		s.send(cmd + '\r\n')
+    #
+    # Create control connection
+    #
+    s = socket(AF_INET, SOCK_STREAM)
+    s.connect((hostname, FTP_PORT))
+    f = s.makefile('r') # Reading the replies is easier from a file...
+    #
+    # Control loop
+    #
+    r = None
+    while 1:
+        code = getreply(f)
+        if code in ('221', 'EOF'): break
+        if code == '150':
+            getdata(r)
+            code = getreply(f)
+            r = None
+        if not r:
+            r = newdataport(s, f)
+        cmd = getcommand()
+        if not cmd: break
+        s.send(cmd + '\r\n')
 
 
 # Create a new data port and send a PORT command to the server for it.
@@ -75,27 +75,27 @@
 nextport = 0
 #
 def newdataport(s, f):
-	global nextport
-	port = nextport + FTP_DATA_PORT
-	nextport = (nextport+1) % 16
-	r = socket(AF_INET, SOCK_STREAM)
-	r.bind((gethostbyname(gethostname()), port))
-	r.listen(1)
-	sendportcmd(s, f, port)
-	return r
+    global nextport
+    port = nextport + FTP_DATA_PORT
+    nextport = (nextport+1) % 16
+    r = socket(AF_INET, SOCK_STREAM)
+    r.bind((gethostbyname(gethostname()), port))
+    r.listen(1)
+    sendportcmd(s, f, port)
+    return r
 
 
 # Send an appropriate port command.
 #
 def sendportcmd(s, f, port):
-	hostname = gethostname()
-	hostaddr = gethostbyname(hostname)
-	hbytes = string.splitfields(hostaddr, '.')
-	pbytes = [repr(port/256), repr(port%256)]
-	bytes = hbytes + pbytes
-	cmd = 'PORT ' + string.joinfields(bytes, ',')
-	s.send(cmd + '\r\n')
-	code = getreply(f)
+    hostname = gethostname()
+    hostaddr = gethostbyname(hostname)
+    hbytes = string.splitfields(hostaddr, '.')
+    pbytes = [repr(port/256), repr(port%256)]
+    bytes = hbytes + pbytes
+    cmd = 'PORT ' + string.joinfields(bytes, ',')
+    s.send(cmd + '\r\n')
+    code = getreply(f)
 
 
 # Process an ftp reply and return the 3-digit reply code (as a string).
@@ -105,40 +105,40 @@
 # Any text while receiving the reply is echoed to the file.
 #
 def getreply(f):
-	line = f.readline()
-	if not line: return 'EOF'
-	print line,
-	code = line[:3]
-	if line[3:4] == '-':
-		while 1:
-			line = f.readline()
-			if not line: break # Really an error
-			print line,
-			if line[:3] == code and line[3:4] != '-': break
-	return code
+    line = f.readline()
+    if not line: return 'EOF'
+    print line,
+    code = line[:3]
+    if line[3:4] == '-':
+        while 1:
+            line = f.readline()
+            if not line: break # Really an error
+            print line,
+            if line[:3] == code and line[3:4] != '-': break
+    return code
 
 
 # Get the data from the data connection.
 #
 def getdata(r):
-	print '(accepting data connection)'
-	conn, host = r.accept()
-	print '(data connection accepted)'
-	while 1:
-		data = conn.recv(BUFSIZE)
-		if not data: break
-		sys.stdout.write(data)
-	print '(end of data connection)'
+    print '(accepting data connection)'
+    conn, host = r.accept()
+    print '(data connection accepted)'
+    while 1:
+        data = conn.recv(BUFSIZE)
+        if not data: break
+        sys.stdout.write(data)
+    print '(end of data connection)'
 
 # Get a command from the user.
 #
 def getcommand():
-	try:
-		while 1:
-			line = raw_input('ftp.py> ')
-			if line: return line
-	except EOFError:
-		return ''
+    try:
+        while 1:
+            line = raw_input('ftp.py> ')
+            if line: return line
+    except EOFError:
+        return ''
 
 
 # Call the main program.
diff --git a/Demo/sockets/gopher.py b/Demo/sockets/gopher.py
index 4e1cb30..cd76659 100755
--- a/Demo/sockets/gopher.py
+++ b/Demo/sockets/gopher.py
@@ -30,8 +30,8 @@
 
 # Dictionary mapping types to strings
 typename = {'0': '<TEXT>', '1': '<DIR>', '2': '<CSO>', '3': '<ERROR>', \
-	'4': '<BINHEX>', '5': '<DOS>', '6': '<UUENCODE>', '7': '<SEARCH>', \
-	'8': '<TELNET>', '9': '<BINARY>', '+': '<REDUNDANT>', 's': '<SOUND>'}
+        '4': '<BINHEX>', '5': '<DOS>', '6': '<UUENCODE>', '7': '<SEARCH>', \
+        '8': '<TELNET>', '9': '<BINARY>', '+': '<REDUNDANT>', 's': '<SOUND>'}
 
 # Oft-used characters and strings
 CRLF = '\r\n'
@@ -39,309 +39,309 @@
 
 # Open a TCP connection to a given host and port
 def open_socket(host, port):
-	if not port:
-		port = DEF_PORT
-	elif type(port) == type(''):
-		port = string.atoi(port)
-	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-	s.connect((host, port))
-	return s
+    if not port:
+        port = DEF_PORT
+    elif type(port) == type(''):
+        port = string.atoi(port)
+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    s.connect((host, port))
+    return s
 
 # Send a selector to a given host and port, return a file with the reply
 def send_request(selector, host, port):
-	s = open_socket(host, port)
-	s.send(selector + CRLF)
-	s.shutdown(1)
-	return s.makefile('r')
+    s = open_socket(host, port)
+    s.send(selector + CRLF)
+    s.shutdown(1)
+    return s.makefile('r')
 
 # Get a menu in the form of a list of entries
 def get_menu(selector, host, port):
-	f = send_request(selector, host, port)
-	list = []
-	while 1:
-		line = f.readline()
-		if not line:
-			print '(Unexpected EOF from server)'
-			break
-		if line[-2:] == CRLF:
-			line = line[:-2]
-		elif line[-1:] in CRLF:
-			line = line[:-1]
-		if line == '.':
-			break
-		if not line:
-			print '(Empty line from server)'
-			continue
-		typechar = line[0]
-		parts = string.splitfields(line[1:], TAB)
-		if len(parts) < 4:
-			print '(Bad line from server: %r)' % (line,)
-			continue
-		if len(parts) > 4:
-			print '(Extra info from server: %r)' % (parts[4:],)
-		parts.insert(0, typechar)
-		list.append(parts)
-	f.close()
-	return list
+    f = send_request(selector, host, port)
+    list = []
+    while 1:
+        line = f.readline()
+        if not line:
+            print '(Unexpected EOF from server)'
+            break
+        if line[-2:] == CRLF:
+            line = line[:-2]
+        elif line[-1:] in CRLF:
+            line = line[:-1]
+        if line == '.':
+            break
+        if not line:
+            print '(Empty line from server)'
+            continue
+        typechar = line[0]
+        parts = string.splitfields(line[1:], TAB)
+        if len(parts) < 4:
+            print '(Bad line from server: %r)' % (line,)
+            continue
+        if len(parts) > 4:
+            print '(Extra info from server: %r)' % (parts[4:],)
+        parts.insert(0, typechar)
+        list.append(parts)
+    f.close()
+    return list
 
 # Get a text file as a list of lines, with trailing CRLF stripped
 def get_textfile(selector, host, port):
-	list = []
-	get_alt_textfile(selector, host, port, list.append)
-	return list
+    list = []
+    get_alt_textfile(selector, host, port, list.append)
+    return list
 
 # Get a text file and pass each line to a function, with trailing CRLF stripped
 def get_alt_textfile(selector, host, port, func):
-	f = send_request(selector, host, port)
-	while 1:
-		line = f.readline()
-		if not line:
-			print '(Unexpected EOF from server)'
-			break
-		if line[-2:] == CRLF:
-			line = line[:-2]
-		elif line[-1:] in CRLF:
-			line = line[:-1]
-		if line == '.':
-			break
-		if line[:2] == '..':
-			line = line[1:]
-		func(line)
-	f.close()
+    f = send_request(selector, host, port)
+    while 1:
+        line = f.readline()
+        if not line:
+            print '(Unexpected EOF from server)'
+            break
+        if line[-2:] == CRLF:
+            line = line[:-2]
+        elif line[-1:] in CRLF:
+            line = line[:-1]
+        if line == '.':
+            break
+        if line[:2] == '..':
+            line = line[1:]
+        func(line)
+    f.close()
 
 # Get a binary file as one solid data block
 def get_binary(selector, host, port):
-	f = send_request(selector, host, port)
-	data = f.read()
-	f.close()
-	return data
+    f = send_request(selector, host, port)
+    data = f.read()
+    f.close()
+    return data
 
 # Get a binary file and pass each block to a function
 def get_alt_binary(selector, host, port, func, blocksize):
-	f = send_request(selector, host, port)
-	while 1:
-		data = f.read(blocksize)
-		if not data:
-			break
-		func(data)
+    f = send_request(selector, host, port)
+    while 1:
+        data = f.read(blocksize)
+        if not data:
+            break
+        func(data)
 
 # A *very* simple interactive browser
 
 # Browser main command, has default arguments
 def browser(*args):
-	selector = DEF_SELECTOR
-	host = DEF_HOST
-	port = DEF_PORT
-	n = len(args)
-	if n > 0 and args[0]:
-		selector = args[0]
-	if n > 1 and args[1]:
-		host = args[1]
-	if n > 2 and args[2]:
-		port = args[2]
-	if n > 3:
-		raise RuntimeError, 'too many args'
-	try:
-		browse_menu(selector, host, port)
-	except socket.error, msg:
-		print 'Socket error:', msg
-		sys.exit(1)
-	except KeyboardInterrupt:
-		print '\n[Goodbye]'
+    selector = DEF_SELECTOR
+    host = DEF_HOST
+    port = DEF_PORT
+    n = len(args)
+    if n > 0 and args[0]:
+        selector = args[0]
+    if n > 1 and args[1]:
+        host = args[1]
+    if n > 2 and args[2]:
+        port = args[2]
+    if n > 3:
+        raise RuntimeError, 'too many args'
+    try:
+        browse_menu(selector, host, port)
+    except socket.error, msg:
+        print 'Socket error:', msg
+        sys.exit(1)
+    except KeyboardInterrupt:
+        print '\n[Goodbye]'
 
 # Browse a menu
 def browse_menu(selector, host, port):
-	list = get_menu(selector, host, port)
-	while 1:
-		print '----- MENU -----'
-		print 'Selector:', repr(selector)
-		print 'Host:', host, ' Port:', port
-		print
-		for i in range(len(list)):
-			item = list[i]
-			typechar, description = item[0], item[1]
-			print string.rjust(repr(i+1), 3) + ':', description,
-			if typename.has_key(typechar):
-				print typename[typechar]
-			else:
-				print '<TYPE=' + repr(typechar) + '>'
-		print
-		while 1:
-			try:
-				str = raw_input('Choice [CR == up a level]: ')
-			except EOFError:
-				print
-				return
-			if not str:
-				return
-			try:
-				choice = string.atoi(str)
-			except string.atoi_error:
-				print 'Choice must be a number; try again:'
-				continue
-			if not 0 < choice <= len(list):
-				print 'Choice out of range; try again:'
-				continue
-			break
-		item = list[choice-1]
-		typechar = item[0]
-		[i_selector, i_host, i_port] = item[2:5]
-		if typebrowser.has_key(typechar):
-			browserfunc = typebrowser[typechar]
-			try:
-				browserfunc(i_selector, i_host, i_port)
-			except (IOError, socket.error):
-				print '***', sys.exc_type, ':', sys.exc_value
-		else:
-			print 'Unsupported object type'
+    list = get_menu(selector, host, port)
+    while 1:
+        print '----- MENU -----'
+        print 'Selector:', repr(selector)
+        print 'Host:', host, ' Port:', port
+        print
+        for i in range(len(list)):
+            item = list[i]
+            typechar, description = item[0], item[1]
+            print string.rjust(repr(i+1), 3) + ':', description,
+            if typename.has_key(typechar):
+                print typename[typechar]
+            else:
+                print '<TYPE=' + repr(typechar) + '>'
+        print
+        while 1:
+            try:
+                str = raw_input('Choice [CR == up a level]: ')
+            except EOFError:
+                print
+                return
+            if not str:
+                return
+            try:
+                choice = string.atoi(str)
+            except string.atoi_error:
+                print 'Choice must be a number; try again:'
+                continue
+            if not 0 < choice <= len(list):
+                print 'Choice out of range; try again:'
+                continue
+            break
+        item = list[choice-1]
+        typechar = item[0]
+        [i_selector, i_host, i_port] = item[2:5]
+        if typebrowser.has_key(typechar):
+            browserfunc = typebrowser[typechar]
+            try:
+                browserfunc(i_selector, i_host, i_port)
+            except (IOError, socket.error):
+                print '***', sys.exc_type, ':', sys.exc_value
+        else:
+            print 'Unsupported object type'
 
 # Browse a text file
 def browse_textfile(selector, host, port):
-	x = None
-	try:
-		p = os.popen('${PAGER-more}', 'w')
-		x = SaveLines(p)
-		get_alt_textfile(selector, host, port, x.writeln)
-	except IOError, msg:
-		print 'IOError:', msg
-	if x:
-		x.close()
-	f = open_savefile()
-	if not f:
-		return
-	x = SaveLines(f)
-	try:
-		get_alt_textfile(selector, host, port, x.writeln)
-		print 'Done.'
-	except IOError, msg:
-		print 'IOError:', msg
-	x.close()
+    x = None
+    try:
+        p = os.popen('${PAGER-more}', 'w')
+        x = SaveLines(p)
+        get_alt_textfile(selector, host, port, x.writeln)
+    except IOError, msg:
+        print 'IOError:', msg
+    if x:
+        x.close()
+    f = open_savefile()
+    if not f:
+        return
+    x = SaveLines(f)
+    try:
+        get_alt_textfile(selector, host, port, x.writeln)
+        print 'Done.'
+    except IOError, msg:
+        print 'IOError:', msg
+    x.close()
 
 # Browse a search index
 def browse_search(selector, host, port):
-	while 1:
-		print '----- SEARCH -----'
-		print 'Selector:', repr(selector)
-		print 'Host:', host, ' Port:', port
-		print
-		try:
-			query = raw_input('Query [CR == up a level]: ')
-		except EOFError:
-			print
-			break
-		query = string.strip(query)
-		if not query:
-			break
-		if '\t' in query:
-			print 'Sorry, queries cannot contain tabs'
-			continue
-		browse_menu(selector + TAB + query, host, port)
+    while 1:
+        print '----- SEARCH -----'
+        print 'Selector:', repr(selector)
+        print 'Host:', host, ' Port:', port
+        print
+        try:
+            query = raw_input('Query [CR == up a level]: ')
+        except EOFError:
+            print
+            break
+        query = string.strip(query)
+        if not query:
+            break
+        if '\t' in query:
+            print 'Sorry, queries cannot contain tabs'
+            continue
+        browse_menu(selector + TAB + query, host, port)
 
 # "Browse" telnet-based information, i.e. open a telnet session
 def browse_telnet(selector, host, port):
-	if selector:
-		print 'Log in as', repr(selector)
-	if type(port) <> type(''):
-		port = repr(port)
-	sts = os.system('set -x; exec telnet ' + host + ' ' + port)
-	if sts:
-		print 'Exit status:', sts
+    if selector:
+        print 'Log in as', repr(selector)
+    if type(port) <> type(''):
+        port = repr(port)
+    sts = os.system('set -x; exec telnet ' + host + ' ' + port)
+    if sts:
+        print 'Exit status:', sts
 
 # "Browse" a binary file, i.e. save it to a file
 def browse_binary(selector, host, port):
-	f = open_savefile()
-	if not f:
-		return
-	x = SaveWithProgress(f)
-	get_alt_binary(selector, host, port, x.write, 8*1024)
-	x.close()
+    f = open_savefile()
+    if not f:
+        return
+    x = SaveWithProgress(f)
+    get_alt_binary(selector, host, port, x.write, 8*1024)
+    x.close()
 
 # "Browse" a sound file, i.e. play it or save it
 def browse_sound(selector, host, port):
-	browse_binary(selector, host, port)
+    browse_binary(selector, host, port)
 
 # Dictionary mapping types to browser functions
 typebrowser = {'0': browse_textfile, '1': browse_menu, \
-	'4': browse_binary, '5': browse_binary, '6': browse_textfile, \
-	'7': browse_search, \
-	'8': browse_telnet, '9': browse_binary, 's': browse_sound}
+        '4': browse_binary, '5': browse_binary, '6': browse_textfile, \
+        '7': browse_search, \
+        '8': browse_telnet, '9': browse_binary, 's': browse_sound}
 
 # Class used to save lines, appending a newline to each line
 class SaveLines:
-	def __init__(self, f):
-		self.f = f
-	def writeln(self, line):
-		self.f.write(line + '\n')
-	def close(self):
-		sts = self.f.close()
-		if sts:
-			print 'Exit status:', sts
+    def __init__(self, f):
+        self.f = f
+    def writeln(self, line):
+        self.f.write(line + '\n')
+    def close(self):
+        sts = self.f.close()
+        if sts:
+            print 'Exit status:', sts
 
 # Class used to save data while showing progress
 class SaveWithProgress:
-	def __init__(self, f):
-		self.f = f
-	def write(self, data):
-		sys.stdout.write('#')
-		sys.stdout.flush()
-		self.f.write(data)
-	def close(self):
-		print
-		sts = self.f.close()
-		if sts:
-			print 'Exit status:', sts
+    def __init__(self, f):
+        self.f = f
+    def write(self, data):
+        sys.stdout.write('#')
+        sys.stdout.flush()
+        self.f.write(data)
+    def close(self):
+        print
+        sts = self.f.close()
+        if sts:
+            print 'Exit status:', sts
 
 # Ask for and open a save file, or return None if not to save
 def open_savefile():
-	try:
-		savefile = raw_input( \
-	    'Save as file [CR == don\'t save; |pipeline or ~user/... OK]: ')
-	except EOFError:
-		print
-		return None
-	savefile = string.strip(savefile)
-	if not savefile:
-		return None
-	if savefile[0] == '|':
-		cmd = string.strip(savefile[1:])
-		try:
-			p = os.popen(cmd, 'w')
-		except IOError, msg:
-			print repr(cmd), ':', msg
-			return None
-		print 'Piping through', repr(cmd), '...'
-		return p
-	if savefile[0] == '~':
-		savefile = os.path.expanduser(savefile)
-	try:
-		f = open(savefile, 'w')
-	except IOError, msg:
-		print repr(savefile), ':', msg
-		return None
-	print 'Saving to', repr(savefile), '...'
-	return f
+    try:
+        savefile = raw_input( \
+    'Save as file [CR == don\'t save; |pipeline or ~user/... OK]: ')
+    except EOFError:
+        print
+        return None
+    savefile = string.strip(savefile)
+    if not savefile:
+        return None
+    if savefile[0] == '|':
+        cmd = string.strip(savefile[1:])
+        try:
+            p = os.popen(cmd, 'w')
+        except IOError, msg:
+            print repr(cmd), ':', msg
+            return None
+        print 'Piping through', repr(cmd), '...'
+        return p
+    if savefile[0] == '~':
+        savefile = os.path.expanduser(savefile)
+    try:
+        f = open(savefile, 'w')
+    except IOError, msg:
+        print repr(savefile), ':', msg
+        return None
+    print 'Saving to', repr(savefile), '...'
+    return f
 
 # Test program
 def test():
-	if sys.argv[4:]:
-		print 'usage: gopher [ [selector] host [port] ]'
-		sys.exit(2)
-	elif sys.argv[3:]:
-		browser(sys.argv[1], sys.argv[2], sys.argv[3])
-	elif sys.argv[2:]:
-		try:
-			port = string.atoi(sys.argv[2])
-			selector = ''
-			host = sys.argv[1]
-		except string.atoi_error:
-			selector = sys.argv[1]
-			host = sys.argv[2]
-			port = ''
-		browser(selector, host, port)
-	elif sys.argv[1:]:
-		browser('', sys.argv[1])
-	else:
-		browser()
+    if sys.argv[4:]:
+        print 'usage: gopher [ [selector] host [port] ]'
+        sys.exit(2)
+    elif sys.argv[3:]:
+        browser(sys.argv[1], sys.argv[2], sys.argv[3])
+    elif sys.argv[2:]:
+        try:
+            port = string.atoi(sys.argv[2])
+            selector = ''
+            host = sys.argv[1]
+        except string.atoi_error:
+            selector = sys.argv[1]
+            host = sys.argv[2]
+            port = ''
+        browser(selector, host, port)
+    elif sys.argv[1:]:
+        browser('', sys.argv[1])
+    else:
+        browser()
 
 # Call the test program as a main program
 test()
diff --git a/Demo/sockets/mcast.py b/Demo/sockets/mcast.py
index 71bcc75..122dad7 100755
--- a/Demo/sockets/mcast.py
+++ b/Demo/sockets/mcast.py
@@ -19,76 +19,76 @@
 
 # Main program
 def main():
-	flags = sys.argv[1:]
-	#
-	if flags:
-		sender(flags[0])
-	else:
-		receiver()
+    flags = sys.argv[1:]
+    #
+    if flags:
+        sender(flags[0])
+    else:
+        receiver()
 
 
 # Sender subroutine (only one per local area network)
 def sender(flag):
-	s = socket(AF_INET, SOCK_DGRAM)
-	if flag == '-b':
-		s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
-		mygroup = '<broadcast>'
-	else:
-		mygroup = MYGROUP
-		ttl = struct.pack('b', 1)		# Time-to-live
-		s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
-	while 1:
-		data = repr(time.time())
-##		data = data + (1400 - len(data)) * '\0'
-		s.sendto(data, (mygroup, MYPORT))
-		time.sleep(1)
+    s = socket(AF_INET, SOCK_DGRAM)
+    if flag == '-b':
+        s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
+        mygroup = '<broadcast>'
+    else:
+        mygroup = MYGROUP
+        ttl = struct.pack('b', 1)               # Time-to-live
+        s.setsockopt(IPPROTO_IP, IP_MULTICAST_TTL, ttl)
+    while 1:
+        data = repr(time.time())
+##              data = data + (1400 - len(data)) * '\0'
+        s.sendto(data, (mygroup, MYPORT))
+        time.sleep(1)
 
 
 # Receiver subroutine (as many as you like)
 def receiver():
-	# Open and initialize the socket
-	s = openmcastsock(MYGROUP, MYPORT)
-	#
-	# Loop, printing any data we receive
-	while 1:
-		data, sender = s.recvfrom(1500)
-		while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
-		print sender, ':', repr(data)
+    # Open and initialize the socket
+    s = openmcastsock(MYGROUP, MYPORT)
+    #
+    # Loop, printing any data we receive
+    while 1:
+        data, sender = s.recvfrom(1500)
+        while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's
+        print sender, ':', repr(data)
 
 
 # Open a UDP socket, bind it to a port and select a multicast group
 def openmcastsock(group, port):
-	# Import modules used only here
-	import string
-	import struct
-	#
-	# Create a socket
-	s = socket(AF_INET, SOCK_DGRAM)
-	#
-	# Allow multiple copies of this program on one machine
-	# (not strictly needed)
-	s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
-	#
-	# Bind it to the port
-	s.bind(('', port))
-	#
-	# Look up multicast group address in name server
-	# (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
-	group = gethostbyname(group)
-	#
-	# Construct binary group address
-	bytes = map(int, string.split(group, "."))
-	grpaddr = 0
-	for byte in bytes: grpaddr = (grpaddr << 8) | byte
-	#
-	# Construct struct mreq from grpaddr and ifaddr
-	ifaddr = INADDR_ANY
-	mreq = struct.pack('ll', htonl(grpaddr), htonl(ifaddr))
-	#
-	# Add group membership
-	s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
-	#
-	return s
+    # Import modules used only here
+    import string
+    import struct
+    #
+    # Create a socket
+    s = socket(AF_INET, SOCK_DGRAM)
+    #
+    # Allow multiple copies of this program on one machine
+    # (not strictly needed)
+    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
+    #
+    # Bind it to the port
+    s.bind(('', port))
+    #
+    # Look up multicast group address in name server
+    # (doesn't hurt if it is already in ddd.ddd.ddd.ddd format)
+    group = gethostbyname(group)
+    #
+    # Construct binary group address
+    bytes = map(int, string.split(group, "."))
+    grpaddr = 0
+    for byte in bytes: grpaddr = (grpaddr << 8) | byte
+    #
+    # Construct struct mreq from grpaddr and ifaddr
+    ifaddr = INADDR_ANY
+    mreq = struct.pack('ll', htonl(grpaddr), htonl(ifaddr))
+    #
+    # Add group membership
+    s.setsockopt(IPPROTO_IP, IP_ADD_MEMBERSHIP, mreq)
+    #
+    return s
 
 
 main()
diff --git a/Demo/sockets/radio.py b/Demo/sockets/radio.py
index b68a4ec..fa4ce75 100755
--- a/Demo/sockets/radio.py
+++ b/Demo/sockets/radio.py
@@ -9,6 +9,6 @@
 s.bind(('', MYPORT))
 
 while 1:
-	data, wherefrom = s.recvfrom(1500, 0)
-	sys.stderr.write(repr(wherefrom) + '\n')
-	sys.stdout.write(data)
+    data, wherefrom = s.recvfrom(1500, 0)
+    sys.stderr.write(repr(wherefrom) + '\n')
+    sys.stdout.write(data)
diff --git a/Demo/sockets/rpython.py b/Demo/sockets/rpython.py
index 77b2a7a..8333d39 100755
--- a/Demo/sockets/rpython.py
+++ b/Demo/sockets/rpython.py
@@ -11,25 +11,25 @@
 BUFSIZE = 1024
 
 def main():
-	if len(sys.argv) < 3:
-		print "usage: rpython host command"
-		sys.exit(2)
-	host = sys.argv[1]
-	port = PORT
-	i = string.find(host, ':')
-	if i >= 0:
-		port = string.atoi(port[i+1:])
-		host = host[:i]
-	command = string.join(sys.argv[2:])
-	s = socket(AF_INET, SOCK_STREAM)
-	s.connect((host, port))
-	s.send(command)
-	s.shutdown(1)
-	reply = ''
-	while 1:
-		data = s.recv(BUFSIZE)
-		if not data: break
-		reply = reply + data
-	print reply,
+    if len(sys.argv) < 3:
+        print "usage: rpython host command"
+        sys.exit(2)
+    host = sys.argv[1]
+    port = PORT
+    i = string.find(host, ':')
+    if i >= 0:
+        port = string.atoi(port[i+1:])
+        host = host[:i]
+    command = string.join(sys.argv[2:])
+    s = socket(AF_INET, SOCK_STREAM)
+    s.connect((host, port))
+    s.send(command)
+    s.shutdown(1)
+    reply = ''
+    while 1:
+        data = s.recv(BUFSIZE)
+        if not data: break
+        reply = reply + data
+    print reply,
 
 main()
diff --git a/Demo/sockets/rpythond.py b/Demo/sockets/rpythond.py
index 1109a99..81397d6 100755
--- a/Demo/sockets/rpythond.py
+++ b/Demo/sockets/rpythond.py
@@ -14,39 +14,39 @@
 BUFSIZE = 1024
 
 def main():
-	if len(sys.argv) > 1:
-		port = int(eval(sys.argv[1]))
-	else:
-		port = PORT
-	s = socket(AF_INET, SOCK_STREAM)
-	s.bind(('', port))
-	s.listen(1)
-	while 1:
-		conn, (remotehost, remoteport) = s.accept()
-		print 'connected by', remotehost, remoteport
-		request = ''
-		while 1:
-			data = conn.recv(BUFSIZE)
-			if not data:
-				break
-			request = request + data
-		reply = execute(request)
-		conn.send(reply)
-		conn.close()
+    if len(sys.argv) > 1:
+        port = int(eval(sys.argv[1]))
+    else:
+        port = PORT
+    s = socket(AF_INET, SOCK_STREAM)
+    s.bind(('', port))
+    s.listen(1)
+    while 1:
+        conn, (remotehost, remoteport) = s.accept()
+        print 'connected by', remotehost, remoteport
+        request = ''
+        while 1:
+            data = conn.recv(BUFSIZE)
+            if not data:
+                break
+            request = request + data
+        reply = execute(request)
+        conn.send(reply)
+        conn.close()
 
 def execute(request):
-	stdout = sys.stdout
-	stderr = sys.stderr
-	sys.stdout = sys.stderr = fakefile = StringIO.StringIO()
-	try:
-		try:
-			exec request in {}, {}
-		except:
-			print
-			traceback.print_exc(100)
-	finally:
-		sys.stderr = stderr
-		sys.stdout = stdout
-	return fakefile.getvalue()
+    stdout = sys.stdout
+    stderr = sys.stderr
+    sys.stdout = sys.stderr = fakefile = StringIO.StringIO()
+    try:
+        try:
+            exec request in {}, {}
+        except:
+            print
+            traceback.print_exc(100)
+    finally:
+        sys.stderr = stderr
+        sys.stdout = stdout
+    return fakefile.getvalue()
 
 main()
diff --git a/Demo/sockets/telnet.py b/Demo/sockets/telnet.py
index d86cbeb..d50c37f 100755
--- a/Demo/sockets/telnet.py
+++ b/Demo/sockets/telnet.py
@@ -20,90 +20,90 @@
 
 # Telnet protocol characters
 
-IAC  = chr(255)	# Interpret as command
+IAC  = chr(255) # Interpret as command
 DONT = chr(254)
 DO   = chr(253)
 WONT = chr(252)
 WILL = chr(251)
 
 def main():
-	host = sys.argv[1]
-	try:
-		hostaddr = gethostbyname(host)
-	except error:
-		sys.stderr.write(sys.argv[1] + ': bad host name\n')
-		sys.exit(2)
-	#
-	if len(sys.argv) > 2:
-		servname = sys.argv[2]
-	else:
-		servname = 'telnet'
-	#
-	if '0' <= servname[:1] <= '9':
-		port = eval(servname)
-	else:
-		try:
-			port = getservbyname(servname, 'tcp')
-		except error:
-			sys.stderr.write(servname + ': bad tcp service name\n')
-			sys.exit(2)
-	#
-	s = socket(AF_INET, SOCK_STREAM)
-	#
-	try:
-		s.connect((host, port))
-	except error, msg:
-		sys.stderr.write('connect failed: ' + repr(msg) + '\n')
-		sys.exit(1)
-	#
-	pid = posix.fork()
-	#
-	if pid == 0:
-		# child -- read stdin, write socket
-		while 1:
-			line = sys.stdin.readline()
-			s.send(line)
-	else:
-		# parent -- read socket, write stdout
-		iac = 0		# Interpret next char as command
-		opt = ''	# Interpret next char as option
-		while 1:
-			data = s.recv(BUFSIZE)
-			if not data:
-				# EOF; kill child and exit
-				sys.stderr.write( '(Closed by remote host)\n')
-				posix.kill(pid, 9)
-				sys.exit(1)
-			cleandata = ''
-			for c in data:
-				if opt:
-					print ord(c)
-					s.send(opt + c)
-					opt = ''
-				elif iac:
-					iac = 0
-					if c == IAC:
-						cleandata = cleandata + c
-					elif c in (DO, DONT):
-						if c == DO: print '(DO)',
-						else: print '(DONT)',
-						opt = IAC + WONT
-					elif c in (WILL, WONT):
-						if c == WILL: print '(WILL)',
-						else: print '(WONT)',
-						opt = IAC + DONT
-					else:
-						print '(command)', ord(c)
-				elif c == IAC:
-					iac = 1
-					print '(IAC)',
-				else:
-					cleandata = cleandata + c
-			sys.stdout.write(cleandata)
-			sys.stdout.flush()
+    host = sys.argv[1]
+    try:
+        hostaddr = gethostbyname(host)
+    except error:
+        sys.stderr.write(sys.argv[1] + ': bad host name\n')
+        sys.exit(2)
+    #
+    if len(sys.argv) > 2:
+        servname = sys.argv[2]
+    else:
+        servname = 'telnet'
+    #
+    if '0' <= servname[:1] <= '9':
+        port = eval(servname)
+    else:
+        try:
+            port = getservbyname(servname, 'tcp')
+        except error:
+            sys.stderr.write(servname + ': bad tcp service name\n')
+            sys.exit(2)
+    #
+    s = socket(AF_INET, SOCK_STREAM)
+    #
+    try:
+        s.connect((host, port))
+    except error, msg:
+        sys.stderr.write('connect failed: ' + repr(msg) + '\n')
+        sys.exit(1)
+    #
+    pid = posix.fork()
+    #
+    if pid == 0:
+        # child -- read stdin, write socket
+        while 1:
+            line = sys.stdin.readline()
+            s.send(line)
+    else:
+        # parent -- read socket, write stdout
+        iac = 0         # Interpret next char as command
+        opt = ''        # Interpret next char as option
+        while 1:
+            data = s.recv(BUFSIZE)
+            if not data:
+                # EOF; kill child and exit
+                sys.stderr.write( '(Closed by remote host)\n')
+                posix.kill(pid, 9)
+                sys.exit(1)
+            cleandata = ''
+            for c in data:
+                if opt:
+                    print ord(c)
+                    s.send(opt + c)
+                    opt = ''
+                elif iac:
+                    iac = 0
+                    if c == IAC:
+                        cleandata = cleandata + c
+                    elif c in (DO, DONT):
+                        if c == DO: print '(DO)',
+                        else: print '(DONT)',
+                        opt = IAC + WONT
+                    elif c in (WILL, WONT):
+                        if c == WILL: print '(WILL)',
+                        else: print '(WONT)',
+                        opt = IAC + DONT
+                    else:
+                        print '(command)', ord(c)
+                elif c == IAC:
+                    iac = 1
+                    print '(IAC)',
+                else:
+                    cleandata = cleandata + c
+            sys.stdout.write(cleandata)
+            sys.stdout.flush()
 
 
 try:
-	main()
+    main()
 except KeyboardInterrupt:
-	pass
+    pass
diff --git a/Demo/sockets/throughput.py b/Demo/sockets/throughput.py
index fa250e7..b8df1f3 100755
--- a/Demo/sockets/throughput.py
+++ b/Demo/sockets/throughput.py
@@ -3,8 +3,8 @@
 # Test network throughput.
 #
 # Usage:
-# 1) on host_A: throughput -s [port]			# start a server
-# 2) on host_B: throughput -c  count host_A [port]	# start a client
+# 1) on host_A: throughput -s [port]                    # start a server
+# 2) on host_B: throughput -c  count host_A [port]      # start a client
 #
 # The server will service multiple clients until it is killed.
 #
@@ -21,73 +21,73 @@
 
 
 def main():
-	if len(sys.argv) < 2:
-		usage()
-	if sys.argv[1] == '-s':
-		server()
-	elif sys.argv[1] == '-c':
-		client()
-	else:
-		usage()
+    if len(sys.argv) < 2:
+        usage()
+    if sys.argv[1] == '-s':
+        server()
+    elif sys.argv[1] == '-c':
+        client()
+    else:
+        usage()
 
 
 def usage():
-	sys.stdout = sys.stderr
-	print 'Usage:    (on host_A) throughput -s [port]'
-	print 'and then: (on host_B) throughput -c count host_A [port]'
-	sys.exit(2)
+    sys.stdout = sys.stderr
+    print 'Usage:    (on host_A) throughput -s [port]'
+    print 'and then: (on host_B) throughput -c count host_A [port]'
+    sys.exit(2)
 
 
 def server():
-	if len(sys.argv) > 2:
-		port = eval(sys.argv[2])
-	else:
-		port = MY_PORT
-	s = socket(AF_INET, SOCK_STREAM)
-	s.bind(('', port))
-	s.listen(1)
-	print 'Server ready...'
-	while 1:
-		conn, (host, remoteport) = s.accept()
-		while 1:
-			data = conn.recv(BUFSIZE)
-			if not data:
-				break
-			del data
-		conn.send('OK\n')
-		conn.close()
-		print 'Done with', host, 'port', remoteport
+    if len(sys.argv) > 2:
+        port = eval(sys.argv[2])
+    else:
+        port = MY_PORT
+    s = socket(AF_INET, SOCK_STREAM)
+    s.bind(('', port))
+    s.listen(1)
+    print 'Server ready...'
+    while 1:
+        conn, (host, remoteport) = s.accept()
+        while 1:
+            data = conn.recv(BUFSIZE)
+            if not data:
+                break
+            del data
+        conn.send('OK\n')
+        conn.close()
+        print 'Done with', host, 'port', remoteport
 
 
 def client():
-	if len(sys.argv) < 4:
-		usage()
-	count = int(eval(sys.argv[2]))
-	host = sys.argv[3]
-	if len(sys.argv) > 4:
-		port = eval(sys.argv[4])
-	else:
-		port = MY_PORT
-	testdata = 'x' * (BUFSIZE-1) + '\n'
-	t1 = time.time()
-	s = socket(AF_INET, SOCK_STREAM)
-	t2 = time.time()
-	s.connect((host, port))
-	t3 = time.time()
-	i = 0
-	while i < count:
-		i = i+1
-		s.send(testdata)
-	s.shutdown(1) # Send EOF
-	t4 = time.time()
-	data = s.recv(BUFSIZE)
-	t5 = time.time()
-	print data
-	print 'Raw timers:', t1, t2, t3, t4, t5
-	print 'Intervals:', t2-t1, t3-t2, t4-t3, t5-t4
-	print 'Total:', t5-t1
-	print 'Throughput:', round((BUFSIZE*count*0.001) / (t5-t1), 3),
-	print 'K/sec.'
+    if len(sys.argv) < 4:
+        usage()
+    count = int(eval(sys.argv[2]))
+    host = sys.argv[3]
+    if len(sys.argv) > 4:
+        port = eval(sys.argv[4])
+    else:
+        port = MY_PORT
+    testdata = 'x' * (BUFSIZE-1) + '\n'
+    t1 = time.time()
+    s = socket(AF_INET, SOCK_STREAM)
+    t2 = time.time()
+    s.connect((host, port))
+    t3 = time.time()
+    i = 0
+    while i < count:
+        i = i+1
+        s.send(testdata)
+    s.shutdown(1) # Send EOF
+    t4 = time.time()
+    data = s.recv(BUFSIZE)
+    t5 = time.time()
+    print data
+    print 'Raw timers:', t1, t2, t3, t4, t5
+    print 'Intervals:', t2-t1, t3-t2, t4-t3, t5-t4
+    print 'Total:', t5-t1
+    print 'Throughput:', round((BUFSIZE*count*0.001) / (t5-t1), 3),
+    print 'K/sec.'
 
 
 main()
diff --git a/Demo/sockets/udpecho.py b/Demo/sockets/udpecho.py
index 720cfe1..5181c82 100755
--- a/Demo/sockets/udpecho.py
+++ b/Demo/sockets/udpecho.py
@@ -12,52 +12,52 @@
 BUFSIZE = 1024
 
 def main():
-	if len(sys.argv) < 2:
-		usage()
-	if sys.argv[1] == '-s':
-		server()
-	elif sys.argv[1] == '-c':
-		client()
-	else:
-		usage()
+    if len(sys.argv) < 2:
+        usage()
+    if sys.argv[1] == '-s':
+        server()
+    elif sys.argv[1] == '-c':
+        client()
+    else:
+        usage()
 
 def usage():
-	sys.stdout = sys.stderr
-	print 'Usage: udpecho -s [port]            (server)'
-	print 'or:    udpecho -c host [port] <file (client)'
-	sys.exit(2)
+    sys.stdout = sys.stderr
+    print 'Usage: udpecho -s [port]            (server)'
+    print 'or:    udpecho -c host [port] <file (client)'
+    sys.exit(2)
 
 def server():
-	if len(sys.argv) > 2:
-		port = eval(sys.argv[2])
-	else:
-		port = ECHO_PORT
-	s = socket(AF_INET, SOCK_DGRAM)
-	s.bind(('', port))
-	print 'udp echo server ready'
-	while 1:
-		data, addr = s.recvfrom(BUFSIZE)
-		print 'server received %r from %r' % (data, addr)
-		s.sendto(data, addr)
+    if len(sys.argv) > 2:
+        port = eval(sys.argv[2])
+    else:
+        port = ECHO_PORT
+    s = socket(AF_INET, SOCK_DGRAM)
+    s.bind(('', port))
+    print 'udp echo server ready'
+    while 1:
+        data, addr = s.recvfrom(BUFSIZE)
+        print 'server received %r from %r' % (data, addr)
+        s.sendto(data, addr)
 
 def client():
-	if len(sys.argv) < 3:
-		usage()
-	host = sys.argv[2]
-	if len(sys.argv) > 3:
-		port = eval(sys.argv[3])
-	else:
-		port = ECHO_PORT
-	addr = host, port
-	s = socket(AF_INET, SOCK_DGRAM)
-	s.bind(('', 0))
-	print 'udp echo client ready, reading stdin'
-	while 1:
-		line = sys.stdin.readline()
-		if not line:
-			break
-		s.sendto(line, addr)
-		data, fromaddr = s.recvfrom(BUFSIZE)
-		print 'client received %r from %r' % (data, fromaddr)
+    if len(sys.argv) < 3:
+        usage()
+    host = sys.argv[2]
+    if len(sys.argv) > 3:
+        port = eval(sys.argv[3])
+    else:
+        port = ECHO_PORT
+    addr = host, port
+    s = socket(AF_INET, SOCK_DGRAM)
+    s.bind(('', 0))
+    print 'udp echo client ready, reading stdin'
+    while 1:
+        line = sys.stdin.readline()
+        if not line:
+            break
+        s.sendto(line, addr)
+        data, fromaddr = s.recvfrom(BUFSIZE)
+        print 'client received %r from %r' % (data, fromaddr)
 
 main()
diff --git a/Demo/sockets/unicast.py b/Demo/sockets/unicast.py
index 0a30f35..dd15e3c 100644
--- a/Demo/sockets/unicast.py
+++ b/Demo/sockets/unicast.py
@@ -9,8 +9,6 @@
 s.bind(('', 0))
 
 while 1:
-	data = repr(time.time()) + '\n'
-	s.sendto(data, ('', MYPORT))
-	time.sleep(2)
-
-	
+    data = repr(time.time()) + '\n'
+    s.sendto(data, ('', MYPORT))
+    time.sleep(2)
diff --git a/Demo/sockets/unixserver.py b/Demo/sockets/unixserver.py
index d4425f0..5eccabb 100644
--- a/Demo/sockets/unixserver.py
+++ b/Demo/sockets/unixserver.py
@@ -2,7 +2,7 @@
 # Piet van Oostrum
 import os
 from socket import *
-FILE = 'blabla'             
+FILE = 'blabla'
 s = socket(AF_UNIX, SOCK_STREAM)
 s.bind(FILE)
 print 'Sock name is: ['+s.getsockname()+']'
diff --git a/setup.py b/setup.py
index 0cd3afc..93a2bde 100644
--- a/setup.py
+++ b/setup.py
@@ -345,7 +345,7 @@
             locale_extra_link_args = ['-framework', 'CoreFoundation']
         else:
             locale_extra_link_args = []
-        
+
 
         exts.append( Extension('_locale', ['_localemodule.c'],
                                libraries=locale_libs,