diff --git a/Tools/scripts/dutree.py b/Tools/scripts/dutree.py
index 5e78d63..63b3e67 100755
--- a/Tools/scripts/dutree.py
+++ b/Tools/scripts/dutree.py
@@ -4,56 +4,56 @@
 import os, string, sys, errno
 
 def main():
-	p = os.popen('du ' + string.join(sys.argv[1:]), 'r')
-	total, d = None, {}
-	for line in p.readlines():
-		i = 0
-		while line[i] in '0123456789': i = i+1
-		size = eval(line[:i])
-		while line[i] in ' \t': i = i+1
-		file = line[i:-1]
-		comps = string.splitfields(file, '/')
-		if comps[0] == '': comps[0] = '/'
-		if comps[len(comps)-1] == '': del comps[len(comps)-1]
-		total, d = store(size, comps, total, d)
-	try:
-		display(total, d)
-	except IOError, e:
-		if e.errno != errno.EPIPE:
-			raise
+    p = os.popen('du ' + string.join(sys.argv[1:]), 'r')
+    total, d = None, {}
+    for line in p.readlines():
+        i = 0
+        while line[i] in '0123456789': i = i+1
+        size = eval(line[:i])
+        while line[i] in ' \t': i = i+1
+        file = line[i:-1]
+        comps = string.splitfields(file, '/')
+        if comps[0] == '': comps[0] = '/'
+        if comps[len(comps)-1] == '': del comps[len(comps)-1]
+        total, d = store(size, comps, total, d)
+    try:
+        display(total, d)
+    except IOError, e:
+        if e.errno != errno.EPIPE:
+            raise
 
 def store(size, comps, total, d):
-	if comps == []:
-		return size, d
-	if not d.has_key(comps[0]):
-		d[comps[0]] = None, {}
-	t1, d1 = d[comps[0]]
-	d[comps[0]] = store(size, comps[1:], t1, d1)
-	return total, d
+    if comps == []:
+        return size, d
+    if not d.has_key(comps[0]):
+        d[comps[0]] = None, {}
+    t1, d1 = d[comps[0]]
+    d[comps[0]] = store(size, comps[1:], t1, d1)
+    return total, d
 
 def display(total, d):
-	show(total, d, '')
+    show(total, d, '')
 
 def show(total, d, prefix):
-	if not d: return
-	list = []
-	sum = 0
-	for key in d.keys():
-		tsub, dsub = d[key]
-		list.append((tsub, key))
-		if tsub is not None: sum = sum + tsub
-## 	if sum < total:
-## 		list.append((total - sum, os.curdir))
-	list.sort()
-	list.reverse()
-	width = len(`list[0][0]`)
-	for tsub, key in list:
-		if tsub is None:
-			psub = prefix
-		else:
-			print prefix + string.rjust(`tsub`, width) + ' ' + key
-			psub = prefix + ' '*(width-1) + '|' + ' '*(len(key)+1)
-		if d.has_key(key):
-			show(tsub, d[key][1], psub)
+    if not d: return
+    list = []
+    sum = 0
+    for key in d.keys():
+        tsub, dsub = d[key]
+        list.append((tsub, key))
+        if tsub is not None: sum = sum + tsub
+##      if sum < total:
+##              list.append((total - sum, os.curdir))
+    list.sort()
+    list.reverse()
+    width = len(`list[0][0]`)
+    for tsub, key in list:
+        if tsub is None:
+            psub = prefix
+        else:
+            print prefix + string.rjust(`tsub`, width) + ' ' + key
+            psub = prefix + ' '*(width-1) + '|' + ' '*(len(key)+1)
+        if d.has_key(key):
+            show(tsub, d[key][1], psub)
 
 main()
