diff --git a/Doc/lib/sqlite3/adapter_datetime.py b/Doc/lib/sqlite3/adapter_datetime.py
index dc41ce8..3460498 100644
--- a/Doc/lib/sqlite3/adapter_datetime.py
+++ b/Doc/lib/sqlite3/adapter_datetime.py
@@ -1,14 +1,14 @@
-import sqlite3
-import datetime, time
-
-def adapt_datetime(ts):
-    return time.mktime(ts.timetuple())
-
-sqlite3.register_adapter(datetime.datetime, adapt_datetime)
-
-con = sqlite3.connect(":memory:")
-cur = con.cursor()
-
-now = datetime.datetime.now()
-cur.execute("select ?", (now,))
-print cur.fetchone()[0]
+import sqlite3
+import datetime, time
+
+def adapt_datetime(ts):
+    return time.mktime(ts.timetuple())
+
+sqlite3.register_adapter(datetime.datetime, adapt_datetime)
+
+con = sqlite3.connect(":memory:")
+cur = con.cursor()
+
+now = datetime.datetime.now()
+cur.execute("select ?", (now,))
+print cur.fetchone()[0]
diff --git a/Doc/lib/sqlite3/adapter_point_1.py b/Doc/lib/sqlite3/adapter_point_1.py
index b4856d5..a741f6c 100644
--- a/Doc/lib/sqlite3/adapter_point_1.py
+++ b/Doc/lib/sqlite3/adapter_point_1.py
@@ -1,16 +1,16 @@
-import sqlite3
-
-class Point(object):
-    def __init__(self, x, y):
-        self.x, self.y = x, y
-
-    def __conform__(self, protocol):
-        if protocol is sqlite3.PrepareProtocol:
-            return "%f;%f" % (self.x, self.y)
-
-con = sqlite3.connect(":memory:")
-cur = con.cursor()
-
-p = Point(4.0, -3.2)
-cur.execute("select ?", (p,))
-print cur.fetchone()[0]
+import sqlite3
+
+class Point(object):
+    def __init__(self, x, y):
+        self.x, self.y = x, y
+
+    def __conform__(self, protocol):
+        if protocol is sqlite3.PrepareProtocol:
+            return "%f;%f" % (self.x, self.y)
+
+con = sqlite3.connect(":memory:")
+cur = con.cursor()
+
+p = Point(4.0, -3.2)
+cur.execute("select ?", (p,))
+print cur.fetchone()[0]
diff --git a/Doc/lib/sqlite3/adapter_point_2.py b/Doc/lib/sqlite3/adapter_point_2.py
index 50e3692..200a064 100644
--- a/Doc/lib/sqlite3/adapter_point_2.py
+++ b/Doc/lib/sqlite3/adapter_point_2.py
@@ -1,17 +1,17 @@
-import sqlite3
-
-class Point(object):
-    def __init__(self, x, y):
-        self.x, self.y = x, y
-
-def adapt_point(point):
-    return "%f;%f" % (point.x, point.y)
-
-sqlite3.register_adapter(Point, adapt_point)
-
-con = sqlite3.connect(":memory:")
-cur = con.cursor()
-
-p = Point(4.0, -3.2)
-cur.execute("select ?", (p,))
-print cur.fetchone()[0]
+import sqlite3
+
+class Point(object):
+    def __init__(self, x, y):
+        self.x, self.y = x, y
+
+def adapt_point(point):
+    return "%f;%f" % (point.x, point.y)
+
+sqlite3.register_adapter(Point, adapt_point)
+
+con = sqlite3.connect(":memory:")
+cur = con.cursor()
+
+p = Point(4.0, -3.2)
+cur.execute("select ?", (p,))
+print cur.fetchone()[0]
diff --git a/Doc/lib/sqlite3/collation_reverse.py b/Doc/lib/sqlite3/collation_reverse.py
index 107f49d..e956402 100644
--- a/Doc/lib/sqlite3/collation_reverse.py
+++ b/Doc/lib/sqlite3/collation_reverse.py
@@ -1,15 +1,15 @@
-import sqlite3
-
-def collate_reverse(string1, string2):
-    return -cmp(string1, string2)
-
-con = sqlite3.connect(":memory:")
-con.create_collation("reverse", collate_reverse)
-
-cur = con.cursor()
-cur.execute("create table test(x)")
-cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])
-cur.execute("select x from test order by x collate reverse")
-for row in cur:
-    print row
-con.close()
+import sqlite3
+
+def collate_reverse(string1, string2):
+    return -cmp(string1, string2)
+
+con = sqlite3.connect(":memory:")
+con.create_collation("reverse", collate_reverse)
+
+cur = con.cursor()
+cur.execute("create table test(x)")
+cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])
+cur.execute("select x from test order by x collate reverse")
+for row in cur:
+    print row
+con.close()
diff --git a/Doc/lib/sqlite3/connect_db_1.py b/Doc/lib/sqlite3/connect_db_1.py
index 8a1437d..1b97523 100644
--- a/Doc/lib/sqlite3/connect_db_1.py
+++ b/Doc/lib/sqlite3/connect_db_1.py
@@ -1,3 +1,3 @@
-import sqlite3
-
-con = sqlite3.connect("mydb")
+import sqlite3
+
+con = sqlite3.connect("mydb")
diff --git a/Doc/lib/sqlite3/connect_db_2.py b/Doc/lib/sqlite3/connect_db_2.py
index 303501d..f9728b3 100644
--- a/Doc/lib/sqlite3/connect_db_2.py
+++ b/Doc/lib/sqlite3/connect_db_2.py
@@ -1,3 +1,3 @@
-import sqlite3
-
-con = sqlite3.connect(":memory:")
+import sqlite3
+
+con = sqlite3.connect(":memory:")
diff --git a/Doc/lib/sqlite3/converter_point.py b/Doc/lib/sqlite3/converter_point.py
index eecd1dc3..e220e9b 100644
--- a/Doc/lib/sqlite3/converter_point.py
+++ b/Doc/lib/sqlite3/converter_point.py
@@ -1,47 +1,47 @@
-import sqlite3
-
-class Point(object):
-    def __init__(self, x, y):
-        self.x, self.y = x, y
-
-    def __repr__(self):
-        return "(%f;%f)" % (self.x, self.y)
-
-def adapt_point(point):
-    return "%f;%f" % (point.x, point.y)
-
-def convert_point(s):
-    x, y = map(float, s.split(";"))
-    return Point(x, y)
-
-# Register the adapter
-sqlite3.register_adapter(Point, adapt_point)
-
-# Register the converter
-sqlite3.register_converter("point", convert_point)
-
-p = Point(4.0, -3.2)
-
-#########################
-# 1) Using declared types
-con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
-cur = con.cursor()
-cur.execute("create table test(p point)")
-
-cur.execute("insert into test(p) values (?)", (p,))
-cur.execute("select p from test")
-print "with declared types:", cur.fetchone()[0]
-cur.close()
-con.close()
-
-#######################
-# 1) Using column names
-con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
-cur = con.cursor()
-cur.execute("create table test(p)")
-
-cur.execute("insert into test(p) values (?)", (p,))
-cur.execute('select p as "p [point]" from test')
-print "with column names:", cur.fetchone()[0]
-cur.close()
-con.close()
+import sqlite3
+
+class Point(object):
+    def __init__(self, x, y):
+        self.x, self.y = x, y
+
+    def __repr__(self):
+        return "(%f;%f)" % (self.x, self.y)
+
+def adapt_point(point):
+    return "%f;%f" % (point.x, point.y)
+
+def convert_point(s):
+    x, y = map(float, s.split(";"))
+    return Point(x, y)
+
+# Register the adapter
+sqlite3.register_adapter(Point, adapt_point)
+
+# Register the converter
+sqlite3.register_converter("point", convert_point)
+
+p = Point(4.0, -3.2)
+
+#########################
+# 1) Using declared types
+con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
+cur = con.cursor()
+cur.execute("create table test(p point)")
+
+cur.execute("insert into test(p) values (?)", (p,))
+cur.execute("select p from test")
+print "with declared types:", cur.fetchone()[0]
+cur.close()
+con.close()
+
+#######################
+# 1) Using column names
+con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
+cur = con.cursor()
+cur.execute("create table test(p)")
+
+cur.execute("insert into test(p) values (?)", (p,))
+cur.execute('select p as "p [point]" from test')
+print "with column names:", cur.fetchone()[0]
+cur.close()
+con.close()
diff --git a/Doc/lib/sqlite3/countcursors.py b/Doc/lib/sqlite3/countcursors.py
index 13ba6a6..df04cad 100644
--- a/Doc/lib/sqlite3/countcursors.py
+++ b/Doc/lib/sqlite3/countcursors.py
@@ -1,15 +1,15 @@
-import sqlite3
-
-class CountCursorsConnection(sqlite3.Connection):
-    def __init__(self, *args, **kwargs):
-        sqlite3.Connection.__init__(self, *args, **kwargs)
-        self.numcursors = 0
-
-    def cursor(self, *args, **kwargs):
-        self.numcursors += 1
-        return sqlite3.Connection.cursor(self, *args, **kwargs)
-
-con = sqlite3.connect(":memory:", factory=CountCursorsConnection)
-cur1 = con.cursor()
-cur2 = con.cursor()
-print con.numcursors
+import sqlite3
+
+class CountCursorsConnection(sqlite3.Connection):
+    def __init__(self, *args, **kwargs):
+        sqlite3.Connection.__init__(self, *args, **kwargs)
+        self.numcursors = 0
+
+    def cursor(self, *args, **kwargs):
+        self.numcursors += 1
+        return sqlite3.Connection.cursor(self, *args, **kwargs)
+
+con = sqlite3.connect(":memory:", factory=CountCursorsConnection)
+cur1 = con.cursor()
+cur2 = con.cursor()
+print con.numcursors
diff --git a/Doc/lib/sqlite3/createdb.py b/Doc/lib/sqlite3/createdb.py
index 2fca21f2..ee2950b 100644
--- a/Doc/lib/sqlite3/createdb.py
+++ b/Doc/lib/sqlite3/createdb.py
@@ -1,28 +1,28 @@
-# Not referenced from the documentation, but builds the database file the other
-# code snippets expect.
-
-import sqlite3
-import os
-
-DB_FILE = "mydb"
-
-if os.path.exists(DB_FILE):
-    os.remove(DB_FILE)
-
-con = sqlite3.connect(DB_FILE)
-cur = con.cursor()
-cur.execute("""
-        create table people
-        (
-          name_last      varchar(20),
-          age            integer
-        )
-        """)
-
-cur.execute("insert into people (name_last, age) values ('Yeltsin',   72)")
-cur.execute("insert into people (name_last, age) values ('Putin',     51)")
-
-con.commit()
-
-cur.close()
-con.close()
+# Not referenced from the documentation, but builds the database file the other
+# code snippets expect.
+
+import sqlite3
+import os
+
+DB_FILE = "mydb"
+
+if os.path.exists(DB_FILE):
+    os.remove(DB_FILE)
+
+con = sqlite3.connect(DB_FILE)
+cur = con.cursor()
+cur.execute("""
+        create table people
+        (
+          name_last      varchar(20),
+          age            integer
+        )
+        """)
+
+cur.execute("insert into people (name_last, age) values ('Yeltsin',   72)")
+cur.execute("insert into people (name_last, age) values ('Putin',     51)")
+
+con.commit()
+
+cur.close()
+con.close()
diff --git a/Doc/lib/sqlite3/execsql_fetchonerow.py b/Doc/lib/sqlite3/execsql_fetchonerow.py
index 51b206d..8044ecf 100644
--- a/Doc/lib/sqlite3/execsql_fetchonerow.py
+++ b/Doc/lib/sqlite3/execsql_fetchonerow.py
@@ -1,17 +1,17 @@
-import sqlite3
-
-con = sqlite3.connect("mydb")
-
-cur = con.cursor()
-SELECT = "select name_last, age from people order by age, name_last"
-
-# 1. Iterate over the rows available from the cursor, unpacking the
-# resulting sequences to yield their elements (name_last, age):
-cur.execute(SELECT)
-for (name_last, age) in cur:
-    print '%s is %d years old.' % (name_last, age)
-
-# 2. Equivalently:
-cur.execute(SELECT)
-for row in cur:
-    print '%s is %d years old.' % (row[0], row[1])
+import sqlite3
+
+con = sqlite3.connect("mydb")
+
+cur = con.cursor()
+SELECT = "select name_last, age from people order by age, name_last"
+
+# 1. Iterate over the rows available from the cursor, unpacking the
+# resulting sequences to yield their elements (name_last, age):
+cur.execute(SELECT)
+for (name_last, age) in cur:
+    print '%s is %d years old.' % (name_last, age)
+
+# 2. Equivalently:
+cur.execute(SELECT)
+for row in cur:
+    print '%s is %d years old.' % (row[0], row[1])
diff --git a/Doc/lib/sqlite3/execsql_printall_1.py b/Doc/lib/sqlite3/execsql_printall_1.py
index b6b2e1e..d27d735 100644
--- a/Doc/lib/sqlite3/execsql_printall_1.py
+++ b/Doc/lib/sqlite3/execsql_printall_1.py
@@ -1,13 +1,13 @@
-import sqlite3
-
-# Create a connection to the database file "mydb":
-con = sqlite3.connect("mydb")
-
-# Get a Cursor object that operates in the context of Connection con:
-cur = con.cursor()
-
-# Execute the SELECT statement:
-cur.execute("select * from people order by age")
-
-# Retrieve all rows as a sequence and print that sequence:
-print cur.fetchall()
+import sqlite3
+
+# Create a connection to the database file "mydb":
+con = sqlite3.connect("mydb")
+
+# Get a Cursor object that operates in the context of Connection con:
+cur = con.cursor()
+
+# Execute the SELECT statement:
+cur.execute("select * from people order by age")
+
+# Retrieve all rows as a sequence and print that sequence:
+print cur.fetchall()
diff --git a/Doc/lib/sqlite3/execute_1.py b/Doc/lib/sqlite3/execute_1.py
index a94cf89..fb3784f 100644
--- a/Doc/lib/sqlite3/execute_1.py
+++ b/Doc/lib/sqlite3/execute_1.py
@@ -1,11 +1,11 @@
-import sqlite3
-
-con = sqlite3.connect("mydb")
-
-cur = con.cursor()
-
-who = "Yeltsin"
-age = 72
-
-cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
-print cur.fetchone()
+import sqlite3
+
+con = sqlite3.connect("mydb")
+
+cur = con.cursor()
+
+who = "Yeltsin"
+age = 72
+
+cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
+print cur.fetchone()
diff --git a/Doc/lib/sqlite3/execute_2.py b/Doc/lib/sqlite3/execute_2.py
index b4333d8..df6c894 100644
--- a/Doc/lib/sqlite3/execute_2.py
+++ b/Doc/lib/sqlite3/execute_2.py
@@ -1,12 +1,12 @@
-import sqlite3
-
-con = sqlite3.connect("mydb")
-
-cur = con.cursor()
-
-who = "Yeltsin"
-age = 72
-
-cur.execute("select name_last, age from people where name_last=:who and age=:age",
-    {"who": who, "age": age})
-print cur.fetchone()
+import sqlite3
+
+con = sqlite3.connect("mydb")
+
+cur = con.cursor()
+
+who = "Yeltsin"
+age = 72
+
+cur.execute("select name_last, age from people where name_last=:who and age=:age",
+    {"who": who, "age": age})
+print cur.fetchone()
diff --git a/Doc/lib/sqlite3/execute_3.py b/Doc/lib/sqlite3/execute_3.py
index 9cd3deb..b64621f 100644
--- a/Doc/lib/sqlite3/execute_3.py
+++ b/Doc/lib/sqlite3/execute_3.py
@@ -1,12 +1,12 @@
-import sqlite3
-
-con = sqlite3.connect("mydb")
-
-cur = con.cursor()
-
-who = "Yeltsin"
-age = 72
-
-cur.execute("select name_last, age from people where name_last=:who and age=:age",
-    locals())
-print cur.fetchone()
+import sqlite3
+
+con = sqlite3.connect("mydb")
+
+cur = con.cursor()
+
+who = "Yeltsin"
+age = 72
+
+cur.execute("select name_last, age from people where name_last=:who and age=:age",
+    locals())
+print cur.fetchone()
diff --git a/Doc/lib/sqlite3/executemany_1.py b/Doc/lib/sqlite3/executemany_1.py
index c0ab7c1..24357c5 100644
--- a/Doc/lib/sqlite3/executemany_1.py
+++ b/Doc/lib/sqlite3/executemany_1.py
@@ -1,24 +1,24 @@
-import sqlite3
-
-class IterChars:
-    def __init__(self):
-        self.count = ord('a')
-
-    def __iter__(self):
-        return self
-
-    def next(self):
-        if self.count > ord('z'):
-            raise StopIteration
-        self.count += 1
-        return (chr(self.count - 1),) # this is a 1-tuple
-
-con = sqlite3.connect(":memory:")
-cur = con.cursor()
-cur.execute("create table characters(c)")
-
-theIter = IterChars()
-cur.executemany("insert into characters(c) values (?)", theIter)
-
-cur.execute("select c from characters")
-print cur.fetchall()
+import sqlite3
+
+class IterChars:
+    def __init__(self):
+        self.count = ord('a')
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        if self.count > ord('z'):
+            raise StopIteration
+        self.count += 1
+        return (chr(self.count - 1),) # this is a 1-tuple
+
+con = sqlite3.connect(":memory:")
+cur = con.cursor()
+cur.execute("create table characters(c)")
+
+theIter = IterChars()
+cur.executemany("insert into characters(c) values (?)", theIter)
+
+cur.execute("select c from characters")
+print cur.fetchall()
diff --git a/Doc/lib/sqlite3/executemany_2.py b/Doc/lib/sqlite3/executemany_2.py
index b16f93a..05857c0 100644
--- a/Doc/lib/sqlite3/executemany_2.py
+++ b/Doc/lib/sqlite3/executemany_2.py
@@ -1,15 +1,15 @@
-import sqlite3
-
-def char_generator():
-    import string
-    for c in string.letters[:26]:
-        yield (c,)
-
-con = sqlite3.connect(":memory:")
-cur = con.cursor()
-cur.execute("create table characters(c)")
-
-cur.executemany("insert into characters(c) values (?)", char_generator())
-
-cur.execute("select c from characters")
-print cur.fetchall()
+import sqlite3
+
+def char_generator():
+    import string
+    for c in string.letters[:26]:
+        yield (c,)
+
+con = sqlite3.connect(":memory:")
+cur = con.cursor()
+cur.execute("create table characters(c)")
+
+cur.executemany("insert into characters(c) values (?)", char_generator())
+
+cur.execute("select c from characters")
+print cur.fetchall()
diff --git a/Doc/lib/sqlite3/executescript.py b/Doc/lib/sqlite3/executescript.py
index 2c04066..0795b47 100644
--- a/Doc/lib/sqlite3/executescript.py
+++ b/Doc/lib/sqlite3/executescript.py
@@ -1,24 +1,24 @@
-import sqlite3
-
-con = sqlite3.connect(":memory:")
-cur = con.cursor()
-cur.executescript("""
-    create table person(
-        firstname,
-        lastname,
-        age
-    );
-
-    create table book(
-        title,
-        author,
-        published
-    );
-
-    insert into book(title, author, published)
-    values (
-        'Dirk Gently''s Holistic Detective Agency
-        'Douglas Adams',
-        1987
-    );
-    """)
+import sqlite3
+
+con = sqlite3.connect(":memory:")
+cur = con.cursor()
+cur.executescript("""
+    create table person(
+        firstname,
+        lastname,
+        age
+    );
+
+    create table book(
+        title,
+        author,
+        published
+    );
+
+    insert into book(title, author, published)
+    values (
+        'Dirk Gently''s Holistic Detective Agency
+        'Douglas Adams',
+        1987
+    );
+    """)
diff --git a/Doc/lib/sqlite3/insert_more_people.py b/Doc/lib/sqlite3/insert_more_people.py
index 430d942..edbc79e 100644
--- a/Doc/lib/sqlite3/insert_more_people.py
+++ b/Doc/lib/sqlite3/insert_more_people.py
@@ -1,16 +1,16 @@
-import sqlite3
-
-con = sqlite3.connect("mydb")
-
-cur = con.cursor()
-
-newPeople = (
-    ('Lebed'       , 53),
-    ('Zhirinovsky' , 57),
-  )
-
-for person in newPeople:
-    cur.execute("insert into people (name_last, age) values (?, ?)", person)
-
-# The changes will not be saved unless the transaction is committed explicitly:
-con.commit()
+import sqlite3
+
+con = sqlite3.connect("mydb")
+
+cur = con.cursor()
+
+newPeople = (
+    ('Lebed'       , 53),
+    ('Zhirinovsky' , 57),
+  )
+
+for person in newPeople:
+    cur.execute("insert into people (name_last, age) values (?, ?)", person)
+
+# The changes will not be saved unless the transaction is committed explicitly:
+con.commit()
diff --git a/Doc/lib/sqlite3/md5func.py b/Doc/lib/sqlite3/md5func.py
index eeb41ea..5769687 100644
--- a/Doc/lib/sqlite3/md5func.py
+++ b/Doc/lib/sqlite3/md5func.py
@@ -1,11 +1,11 @@
-import sqlite3
-import md5
-
-def md5sum(t):
-    return md5.md5(t).hexdigest()
-
-con = sqlite3.connect(":memory:")
-con.create_function("md5", 1, md5sum)
-cur = con.cursor()
-cur.execute("select md5(?)", ("foo",))
-print cur.fetchone()[0]
+import sqlite3
+import md5
+
+def md5sum(t):
+    return md5.md5(t).hexdigest()
+
+con = sqlite3.connect(":memory:")
+con.create_function("md5", 1, md5sum)
+cur = con.cursor()
+cur.execute("select md5(?)", ("foo",))
+print cur.fetchone()[0]
diff --git a/Doc/lib/sqlite3/mysumaggr.py b/Doc/lib/sqlite3/mysumaggr.py
index b398726..6d0cd55 100644
--- a/Doc/lib/sqlite3/mysumaggr.py
+++ b/Doc/lib/sqlite3/mysumaggr.py
@@ -1,20 +1,20 @@
-import sqlite3
-
-class MySum:
-    def __init__(self):
-        self.count = 0
-
-    def step(self, value):
-        self.count += value
-
-    def finalize(self):
-        return self.count
-
-con = sqlite3.connect(":memory:")
-con.create_aggregate("mysum", 1, MySum)
-cur = con.cursor()
-cur.execute("create table test(i)")
-cur.execute("insert into test(i) values (1)")
-cur.execute("insert into test(i) values (2)")
-cur.execute("select mysum(i) from test")
-print cur.fetchone()[0]
+import sqlite3
+
+class MySum:
+    def __init__(self):
+        self.count = 0
+
+    def step(self, value):
+        self.count += value
+
+    def finalize(self):
+        return self.count
+
+con = sqlite3.connect(":memory:")
+con.create_aggregate("mysum", 1, MySum)
+cur = con.cursor()
+cur.execute("create table test(i)")
+cur.execute("insert into test(i) values (1)")
+cur.execute("insert into test(i) values (2)")
+cur.execute("select mysum(i) from test")
+print cur.fetchone()[0]
diff --git a/Doc/lib/sqlite3/parse_colnames.py b/Doc/lib/sqlite3/parse_colnames.py
index bbb93e9..fcded00 100644
--- a/Doc/lib/sqlite3/parse_colnames.py
+++ b/Doc/lib/sqlite3/parse_colnames.py
@@ -1,8 +1,8 @@
-import sqlite3
-import datetime
-
-con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
-cur = con.cursor()
-cur.execute('select ? as "x [timestamp]"', (datetime.datetime.now(),))
-dt = cur.fetchone()[0]
-print dt, type(dt)
+import sqlite3
+import datetime
+
+con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_COLNAMES)
+cur = con.cursor()
+cur.execute('select ? as "x [timestamp]"', (datetime.datetime.now(),))
+dt = cur.fetchone()[0]
+print dt, type(dt)
diff --git a/Doc/lib/sqlite3/pysqlite_datetime.py b/Doc/lib/sqlite3/pysqlite_datetime.py
index f9dfa14..efa4b06 100644
--- a/Doc/lib/sqlite3/pysqlite_datetime.py
+++ b/Doc/lib/sqlite3/pysqlite_datetime.py
@@ -1,20 +1,20 @@
-import sqlite3
-import datetime
-
-con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
-cur = con.cursor()
-cur.execute("create table test(d date, ts timestamp)")
-
-today = datetime.date.today()
-now = datetime.datetime.now()
-
-cur.execute("insert into test(d, ts) values (?, ?)", (today, now))
-cur.execute("select d, ts from test")
-row = cur.fetchone()
-print today, "=>", row[0], type(row[0])
-print now, "=>", row[1], type(row[1])
-
-cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"')
-row = cur.fetchone()
-print "current_date", row[0], type(row[0])
-print "current_timestamp", row[1], type(row[1])
+import sqlite3
+import datetime
+
+con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
+cur = con.cursor()
+cur.execute("create table test(d date, ts timestamp)")
+
+today = datetime.date.today()
+now = datetime.datetime.now()
+
+cur.execute("insert into test(d, ts) values (?, ?)", (today, now))
+cur.execute("select d, ts from test")
+row = cur.fetchone()
+print today, "=>", row[0], type(row[0])
+print now, "=>", row[1], type(row[1])
+
+cur.execute('select current_date as "d [date]", current_timestamp as "ts [timestamp]"')
+row = cur.fetchone()
+print "current_date", row[0], type(row[0])
+print "current_timestamp", row[1], type(row[1])
diff --git a/Doc/lib/sqlite3/row_factory.py b/Doc/lib/sqlite3/row_factory.py
index 3597459..64676c8 100644
--- a/Doc/lib/sqlite3/row_factory.py
+++ b/Doc/lib/sqlite3/row_factory.py
@@ -1,13 +1,13 @@
-import sqlite3
-
-def dict_factory(cursor, row):
-    d = {}
-    for idx, col in enumerate(cursor.description):
-        d[col[0]] = row[idx]
-    return d
-
-con = sqlite3.connect(":memory:")
-con.row_factory = dict_factory
-cur = con.cursor()
-cur.execute("select 1 as a")
-print cur.fetchone()["a"]
+import sqlite3
+
+def dict_factory(cursor, row):
+    d = {}
+    for idx, col in enumerate(cursor.description):
+        d[col[0]] = row[idx]
+    return d
+
+con = sqlite3.connect(":memory:")
+con.row_factory = dict_factory
+cur = con.cursor()
+cur.execute("select 1 as a")
+print cur.fetchone()["a"]
diff --git a/Doc/lib/sqlite3/shortcut_methods.py b/Doc/lib/sqlite3/shortcut_methods.py
index 12ce0c0..72ed4b3 100644
--- a/Doc/lib/sqlite3/shortcut_methods.py
+++ b/Doc/lib/sqlite3/shortcut_methods.py
@@ -1,21 +1,21 @@
-import sqlite3
-
-persons = [
-    ("Hugo", "Boss"),
-    ("Calvin", "Klein")
-    ]
-
-con = sqlite3.connect(":memory:")
-
-# Create the table
-con.execute("create table person(firstname, lastname)")
-
-# Fill the table
-con.executemany("insert into person(firstname, lastname) values (?, ?)", persons)
-
-# Print the table contents
-for row in con.execute("select firstname, lastname from person"):
-    print row
-
-# Using a dummy WHERE clause to not let SQLite take the shortcut table deletes.
-print "I just deleted", con.execute("delete from person where 1=1").rowcount, "rows"
+import sqlite3
+
+persons = [
+    ("Hugo", "Boss"),
+    ("Calvin", "Klein")
+    ]
+
+con = sqlite3.connect(":memory:")
+
+# Create the table
+con.execute("create table person(firstname, lastname)")
+
+# Fill the table
+con.executemany("insert into person(firstname, lastname) values (?, ?)", persons)
+
+# Print the table contents
+for row in con.execute("select firstname, lastname from person"):
+    print row
+
+# Using a dummy WHERE clause to not let SQLite take the shortcut table deletes.
+print "I just deleted", con.execute("delete from person where 1=1").rowcount, "rows"
diff --git a/Doc/lib/sqlite3/simple_tableprinter.py b/Doc/lib/sqlite3/simple_tableprinter.py
index 6368668..67ea6a2 100644
--- a/Doc/lib/sqlite3/simple_tableprinter.py
+++ b/Doc/lib/sqlite3/simple_tableprinter.py
@@ -1,26 +1,26 @@
-import sqlite3
-
-FIELD_MAX_WIDTH = 20
-TABLE_NAME = 'people'
-SELECT = 'select * from %s order by age, name_last' % TABLE_NAME
-
-con = sqlite3.connect("mydb")
-
-cur = con.cursor()
-cur.execute(SELECT)
-
-# Print a header.
-for fieldDesc in cur.description:
-    print fieldDesc[0].ljust(FIELD_MAX_WIDTH) ,
-print # Finish the header with a newline.
-print '-' * 78
-
-# For each row, print the value of each field left-justified within
-# the maximum possible width of that field.
-fieldIndices = range(len(cur.description))
-for row in cur:
-    for fieldIndex in fieldIndices:
-        fieldValue = str(row[fieldIndex])
-        print fieldValue.ljust(FIELD_MAX_WIDTH) ,
-
-    print # Finish the row with a newline.
+import sqlite3
+
+FIELD_MAX_WIDTH = 20
+TABLE_NAME = 'people'
+SELECT = 'select * from %s order by age, name_last' % TABLE_NAME
+
+con = sqlite3.connect("mydb")
+
+cur = con.cursor()
+cur.execute(SELECT)
+
+# Print a header.
+for fieldDesc in cur.description:
+    print fieldDesc[0].ljust(FIELD_MAX_WIDTH) ,
+print # Finish the header with a newline.
+print '-' * 78
+
+# For each row, print the value of each field left-justified within
+# the maximum possible width of that field.
+fieldIndices = range(len(cur.description))
+for row in cur:
+    for fieldIndex in fieldIndices:
+        fieldValue = str(row[fieldIndex])
+        print fieldValue.ljust(FIELD_MAX_WIDTH) ,
+
+    print # Finish the row with a newline.
diff --git a/Doc/lib/sqlite3/text_factory.py b/Doc/lib/sqlite3/text_factory.py
index 13c832d..3e157a8 100644
--- a/Doc/lib/sqlite3/text_factory.py
+++ b/Doc/lib/sqlite3/text_factory.py
@@ -1,42 +1,42 @@
-import sqlite3
-
-con = sqlite3.connect(":memory:")
-cur = con.cursor()
-
-# Create the table
-con.execute("create table person(lastname, firstname)")
-
-AUSTRIA = u"\xd6sterreich"
-
-# by default, rows are returned as Unicode
-cur.execute("select ?", (AUSTRIA,))
-row = cur.fetchone()
-assert row[0] == AUSTRIA
-
-# but we can make pysqlite always return bytestrings ...
-con.text_factory = str
-cur.execute("select ?", (AUSTRIA,))
-row = cur.fetchone()
-assert type(row[0]) == str
-# the bytestrings will be encoded in UTF-8, unless you stored garbage in the
-# database ...
-assert row[0] == AUSTRIA.encode("utf-8")
-
-# we can also implement a custom text_factory ...
-# here we implement one that will ignore Unicode characters that cannot be
-# decoded from UTF-8
-con.text_factory = lambda x: unicode(x, "utf-8", "ignore")
-cur.execute("select ?", ("this is latin1 and would normally create errors" + u"\xe4\xf6\xfc".encode("latin1"),))
-row = cur.fetchone()
-assert type(row[0]) == unicode
-
-# pysqlite offers a builtin optimized text_factory that will return bytestring
-# objects, if the data is in ASCII only, and otherwise return unicode objects
-con.text_factory = sqlite3.OptimizedUnicode
-cur.execute("select ?", (AUSTRIA,))
-row = cur.fetchone()
-assert type(row[0]) == unicode
-
-cur.execute("select ?", ("Germany",))
-row = cur.fetchone()
-assert type(row[0]) == str
+import sqlite3
+
+con = sqlite3.connect(":memory:")
+cur = con.cursor()
+
+# Create the table
+con.execute("create table person(lastname, firstname)")
+
+AUSTRIA = u"\xd6sterreich"
+
+# by default, rows are returned as Unicode
+cur.execute("select ?", (AUSTRIA,))
+row = cur.fetchone()
+assert row[0] == AUSTRIA
+
+# but we can make pysqlite always return bytestrings ...
+con.text_factory = str
+cur.execute("select ?", (AUSTRIA,))
+row = cur.fetchone()
+assert type(row[0]) == str
+# the bytestrings will be encoded in UTF-8, unless you stored garbage in the
+# database ...
+assert row[0] == AUSTRIA.encode("utf-8")
+
+# we can also implement a custom text_factory ...
+# here we implement one that will ignore Unicode characters that cannot be
+# decoded from UTF-8
+con.text_factory = lambda x: unicode(x, "utf-8", "ignore")
+cur.execute("select ?", ("this is latin1 and would normally create errors" + u"\xe4\xf6\xfc".encode("latin1"),))
+row = cur.fetchone()
+assert type(row[0]) == unicode
+
+# pysqlite offers a builtin optimized text_factory that will return bytestring
+# objects, if the data is in ASCII only, and otherwise return unicode objects
+con.text_factory = sqlite3.OptimizedUnicode
+cur.execute("select ?", (AUSTRIA,))
+row = cur.fetchone()
+assert type(row[0]) == unicode
+
+cur.execute("select ?", ("Germany",))
+row = cur.fetchone()
+assert type(row[0]) == str
diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py
index f685d14..255428f 100644
--- a/Lib/test/test_bigmem.py
+++ b/Lib/test/test_bigmem.py
@@ -1,964 +1,964 @@
-from test import test_support
-from test.test_support import bigmemtest, _1G, _2G
-
-import unittest
-import operator
-import string
-import sys
-
-# Bigmem testing houserules:
-#
-#  - Try not to allocate too many large objects. It's okay to rely on
-#    refcounting semantics, but don't forget that 's = create_largestring()'
-#    doesn't release the old 's' (if it exists) until well after its new
-#    value has been created. Use 'del s' before the create_largestring call.
-#
-#  - Do *not* compare large objects using assertEquals or similar. It's a
-#    lengty operation and the errormessage will be utterly useless due to
-#    its size. To make sure whether a result has the right contents, better
-#    to use the strip or count methods, or compare meaningful slices.
-#
-#  - Don't forget to test for large indices, offsets and results and such,
-#    in addition to large sizes.
-#
-#  - When repeating an object (say, a substring, or a small list) to create
-#    a large object, make the subobject of a length that is not a power of
-#    2. That way, int-wrapping problems are more easily detected.
-#
-#  - While the bigmemtest decorator speaks of 'minsize', all tests will
-#    actually be called with a much smaller number too, in the normal
-#    test run (5Kb currently.) This is so the tests themselves get frequent
-#    testing Consequently, always make all large allocations based on the
-#    passed-in 'size', and don't rely on the size being very large. Also,
-#    memuse-per-size should remain sane (less than a few thousand); if your
-#    test uses more, adjust 'size' upward, instead.
-
-class StrTest(unittest.TestCase):
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_capitalize(self, size):
-        SUBSTR = ' abc def ghi'
-        s = '-' * size + SUBSTR
-        caps = s.capitalize()
-        self.assertEquals(caps[-len(SUBSTR):],
-                         SUBSTR.capitalize())
-        self.assertEquals(caps.lstrip('-'), SUBSTR)
-
-    @bigmemtest(minsize=_2G + 10, memuse=1)
-    def test_center(self, size):
-        SUBSTR = ' abc def ghi'
-        s = SUBSTR.center(size)
-        self.assertEquals(len(s), size)
-        lpadsize = rpadsize = (len(s) - len(SUBSTR)) // 2
-        if len(s) % 2:
-            lpadsize += 1
-        self.assertEquals(s[lpadsize:-rpadsize], SUBSTR)
-        self.assertEquals(s.strip(), SUBSTR.strip())
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_count(self, size):
-        SUBSTR = ' abc def ghi'
-        s = '.' * size + SUBSTR
-        self.assertEquals(s.count('.'), size)
-        s += '.'
-        self.assertEquals(s.count('.'), size + 1)
-        self.assertEquals(s.count(' '), 3)
-        self.assertEquals(s.count('i'), 1)
-        self.assertEquals(s.count('j'), 0)
-
-    @bigmemtest(minsize=0, memuse=1)
-    def test_decode(self, size):
-        pass
-
-    @bigmemtest(minsize=0, memuse=1)
-    def test_encode(self, size):
-        pass
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_endswith(self, size):
-        SUBSTR = ' abc def ghi'
-        s = '-' * size + SUBSTR
-        self.failUnless(s.endswith(SUBSTR))
-        self.failUnless(s.endswith(s))
-        s2 = '...' + s
-        self.failUnless(s2.endswith(s))
-        self.failIf(s.endswith('a' + SUBSTR))
-        self.failIf(SUBSTR.endswith(s))
-
-    @bigmemtest(minsize=_2G + 10, memuse=2)
-    def test_expandtabs(self, size):
-        s = '-' * size
-        tabsize = 8
-        self.assertEquals(s.expandtabs(), s)
-        del s
-        slen, remainder = divmod(size, tabsize)
-        s = '       \t' * slen
-        s = s.expandtabs(tabsize)
-        self.assertEquals(len(s), size - remainder)
-        self.assertEquals(len(s.strip(' ')), 0)
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_find(self, size):
-        SUBSTR = ' abc def ghi'
-        sublen = len(SUBSTR)
-        s = ''.join([SUBSTR, '-' * size, SUBSTR])
-        self.assertEquals(s.find(' '), 0)
-        self.assertEquals(s.find(SUBSTR), 0)
-        self.assertEquals(s.find(' ', sublen), sublen + size)
-        self.assertEquals(s.find(SUBSTR, len(SUBSTR)), sublen + size)
-        self.assertEquals(s.find('i'), SUBSTR.find('i'))
-        self.assertEquals(s.find('i', sublen),
-                         sublen + size + SUBSTR.find('i'))
-        self.assertEquals(s.find('i', size),
-                         sublen + size + SUBSTR.find('i'))
-        self.assertEquals(s.find('j'), -1)
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_index(self, size):
-        SUBSTR = ' abc def ghi'
-        sublen = len(SUBSTR)
-        s = ''.join([SUBSTR, '-' * size, SUBSTR])
-        self.assertEquals(s.index(' '), 0)
-        self.assertEquals(s.index(SUBSTR), 0)
-        self.assertEquals(s.index(' ', sublen), sublen + size)
-        self.assertEquals(s.index(SUBSTR, sublen), sublen + size)
-        self.assertEquals(s.index('i'), SUBSTR.index('i'))
-        self.assertEquals(s.index('i', sublen),
-                         sublen + size + SUBSTR.index('i'))
-        self.assertEquals(s.index('i', size),
-                         sublen + size + SUBSTR.index('i'))
-        self.assertRaises(ValueError, s.index, 'j')
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_isalnum(self, size):
-        SUBSTR = '123456'
-        s = 'a' * size + SUBSTR
-        self.failUnless(s.isalnum())
-        s += '.'
-        self.failIf(s.isalnum())
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_isalpha(self, size):
-        SUBSTR = 'zzzzzzz'
-        s = 'a' * size + SUBSTR
-        self.failUnless(s.isalpha())
-        s += '.'
-        self.failIf(s.isalpha())
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_isdigit(self, size):
-        SUBSTR = '123456'
-        s = '9' * size + SUBSTR
-        self.failUnless(s.isdigit())
-        s += 'z'
-        self.failIf(s.isdigit())
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_islower(self, size):
-        chars = ''.join([ chr(c) for c in range(255) if not chr(c).isupper() ])
-        repeats = size // len(chars) + 2
-        s = chars * repeats
-        self.failUnless(s.islower())
-        s += 'A'
-        self.failIf(s.islower())
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_isspace(self, size):
-        whitespace = ' \f\n\r\t\v'
-        repeats = size // len(whitespace) + 2
-        s = whitespace * repeats
-        self.failUnless(s.isspace())
-        s += 'j'
-        self.failIf(s.isspace())
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_istitle(self, size):
-        SUBSTR = '123456'
-        s = ''.join(['A', 'a' * size, SUBSTR])
-        self.failUnless(s.istitle())
-        s += 'A'
-        self.failUnless(s.istitle())
-        s += 'aA'
-        self.failIf(s.istitle())
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_isupper(self, size):
-        chars = ''.join([ chr(c) for c in range(255) if not chr(c).islower() ])
-        repeats = size // len(chars) + 2
-        s = chars * repeats
-        self.failUnless(s.isupper())
-        s += 'a'
-        self.failIf(s.isupper())
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_join(self, size):
-        s = 'A' * size
-        x = s.join(['aaaaa', 'bbbbb'])
-        self.assertEquals(x.count('a'), 5)
-        self.assertEquals(x.count('b'), 5)
-        self.failUnless(x.startswith('aaaaaA'))
-        self.failUnless(x.endswith('Abbbbb'))
-
-    @bigmemtest(minsize=_2G + 10, memuse=1)
-    def test_ljust(self, size):
-        SUBSTR = ' abc def ghi'
-        s = SUBSTR.ljust(size)
-        self.failUnless(s.startswith(SUBSTR + '  '))
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.strip(), SUBSTR.strip())
-
-    @bigmemtest(minsize=_2G + 10, memuse=2)
-    def test_lower(self, size):
-        s = 'A' * size
-        s = s.lower()
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.count('a'), size)
-
-    @bigmemtest(minsize=_2G + 10, memuse=1)
-    def test_lstrip(self, size):
-        SUBSTR = 'abc def ghi'
-        s = SUBSTR.rjust(size)
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.lstrip(), SUBSTR.lstrip())
-        del s
-        s = SUBSTR.ljust(size)
-        self.assertEquals(len(s), size)
-        stripped = s.lstrip()
-        self.failUnless(stripped is s)
-
-    @bigmemtest(minsize=_2G + 10, memuse=2)
-    def test_replace(self, size):
-        replacement = 'a'
-        s = ' ' * size
-        s = s.replace(' ', replacement)
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.count(replacement), size)
-        s = s.replace(replacement, ' ', size - 4)
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.count(replacement), 4)
-        self.assertEquals(s[-10:], '      aaaa')
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_rfind(self, size):
-        SUBSTR = ' abc def ghi'
-        sublen = len(SUBSTR)
-        s = ''.join([SUBSTR, '-' * size, SUBSTR])
-        self.assertEquals(s.rfind(' '), sublen + size + SUBSTR.rfind(' '))
-        self.assertEquals(s.rfind(SUBSTR), sublen + size)
-        self.assertEquals(s.rfind(' ', 0, size), SUBSTR.rfind(' '))
-        self.assertEquals(s.rfind(SUBSTR, 0, sublen + size), 0)
-        self.assertEquals(s.rfind('i'), sublen + size + SUBSTR.rfind('i'))
-        self.assertEquals(s.rfind('i', 0, sublen), SUBSTR.rfind('i'))
-        self.assertEquals(s.rfind('i', 0, sublen + size),
-                          SUBSTR.rfind('i'))
-        self.assertEquals(s.rfind('j'), -1)
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_rindex(self, size):
-        SUBSTR = ' abc def ghi'
-        sublen = len(SUBSTR)
-        s = ''.join([SUBSTR, '-' * size, SUBSTR])
-        self.assertEquals(s.rindex(' '),
-                          sublen + size + SUBSTR.rindex(' '))
-        self.assertEquals(s.rindex(SUBSTR), sublen + size)
-        self.assertEquals(s.rindex(' ', 0, sublen + size - 1),
-                          SUBSTR.rindex(' '))
-        self.assertEquals(s.rindex(SUBSTR, 0, sublen + size), 0)
-        self.assertEquals(s.rindex('i'),
-                          sublen + size + SUBSTR.rindex('i'))
-        self.assertEquals(s.rindex('i', 0, sublen), SUBSTR.rindex('i'))
-        self.assertEquals(s.rindex('i', 0, sublen + size),
-                          SUBSTR.rindex('i'))
-        self.assertRaises(ValueError, s.rindex, 'j')
-
-    @bigmemtest(minsize=_2G + 10, memuse=1)
-    def test_rjust(self, size):
-        SUBSTR = ' abc def ghi'
-        s = SUBSTR.ljust(size)
-        self.failUnless(s.startswith(SUBSTR + '  '))
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.strip(), SUBSTR.strip())
-
-    @bigmemtest(minsize=_2G + 10, memuse=1)
-    def test_rstrip(self, size):
-        SUBSTR = ' abc def ghi'
-        s = SUBSTR.ljust(size)
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.rstrip(), SUBSTR.rstrip())
-        del s
-        s = SUBSTR.rjust(size)
-        self.assertEquals(len(s), size)
-        stripped = s.rstrip()
-        self.failUnless(stripped is s)
-
-    # The test takes about size bytes to build a string, and then about
-    # sqrt(size) substrings of sqrt(size) in size and a list to
-    # hold sqrt(size) items. It's close but just over 2x size.
-    @bigmemtest(minsize=_2G, memuse=2.1)
-    def test_split_small(self, size):
-        # Crudely calculate an estimate so that the result of s.split won't
-        # take up an inordinate amount of memory
-        chunksize = int(size ** 0.5 + 2)
-        SUBSTR = 'a' + ' ' * chunksize
-        s = SUBSTR * chunksize
-        l = s.split()
-        self.assertEquals(len(l), chunksize)
-        self.assertEquals(set(l), set(['a']))
-        del l
-        l = s.split('a')
-        self.assertEquals(len(l), chunksize + 1)
-        self.assertEquals(set(l), set(['', ' ' * chunksize]))
-
-    # Allocates a string of twice size (and briefly two) and a list of
-    # size.  Because of internal affairs, the s.split() call produces a
-    # list of size times the same one-character string, so we only
-    # suffer for the list size. (Otherwise, it'd cost another 48 times
-    # size in bytes!) Nevertheless, a list of size takes
-    # 8*size bytes.
-    @bigmemtest(minsize=_2G + 5, memuse=10)
-    def test_split_large(self, size):
-        s = ' a' * size + ' '
-        l = s.split()
-        self.assertEquals(len(l), size)
-        self.assertEquals(set(l), set(['a']))
-        del l
-        l = s.split('a')
-        self.assertEquals(len(l), size + 1)
-        self.assertEquals(set(l), set([' ']))
-
-    @bigmemtest(minsize=_2G, memuse=2.1)
-    def test_splitlines(self, size):
-        # Crudely calculate an estimate so that the result of s.split won't
-        # take up an inordinate amount of memory
-        chunksize = int(size ** 0.5 + 2) // 2
-        SUBSTR = ' ' * chunksize + '\n' + ' ' * chunksize + '\r\n'
-        s = SUBSTR * chunksize
-        l = s.splitlines()
-        self.assertEquals(len(l), chunksize * 2)
-        self.assertEquals(set(l), set([' ' * chunksize]))
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_startswith(self, size):
-        SUBSTR = ' abc def ghi'
-        s = '-' * size + SUBSTR
-        self.failUnless(s.startswith(s))
-        self.failUnless(s.startswith('-' * size))
-        self.failIf(s.startswith(SUBSTR))
-
-    @bigmemtest(minsize=_2G, memuse=1)
-    def test_strip(self, size):
-        SUBSTR = '   abc def ghi   '
-        s = SUBSTR.rjust(size)
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.strip(), SUBSTR.strip())
-        del s
-        s = SUBSTR.ljust(size)
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.strip(), SUBSTR.strip())
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_swapcase(self, size):
-        SUBSTR = "aBcDeFG12.'\xa9\x00"
-        sublen = len(SUBSTR)
-        repeats = size // sublen + 2
-        s = SUBSTR * repeats
-        s = s.swapcase()
-        self.assertEquals(len(s), sublen * repeats)
-        self.assertEquals(s[:sublen * 3], SUBSTR.swapcase() * 3)
-        self.assertEquals(s[-sublen * 3:], SUBSTR.swapcase() * 3)
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_title(self, size):
-        SUBSTR = 'SpaaHAaaAaham'
-        s = SUBSTR * (size // len(SUBSTR) + 2)
-        s = s.title()
-        self.failUnless(s.startswith((SUBSTR * 3).title()))
-        self.failUnless(s.endswith(SUBSTR.lower() * 3))
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_translate(self, size):
-        trans = string.maketrans('.aZ', '-!$')
-        SUBSTR = 'aZz.z.Aaz.'
-        sublen = len(SUBSTR)
-        repeats = size // sublen + 2
-        s = SUBSTR * repeats
-        s = s.translate(trans)
-        self.assertEquals(len(s), repeats * sublen)
-        self.assertEquals(s[:sublen], SUBSTR.translate(trans))
-        self.assertEquals(s[-sublen:], SUBSTR.translate(trans))
-        self.assertEquals(s.count('.'), 0)
-        self.assertEquals(s.count('!'), repeats * 2)
-        self.assertEquals(s.count('z'), repeats * 3)
-
-    @bigmemtest(minsize=_2G + 5, memuse=2)
-    def test_upper(self, size):
-        s = 'a' * size
-        s = s.upper()
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.count('A'), size)
-
-    @bigmemtest(minsize=_2G + 20, memuse=1)
-    def test_zfill(self, size):
-        SUBSTR = '-568324723598234'
-        s = SUBSTR.zfill(size)
-        self.failUnless(s.endswith('0' + SUBSTR[1:]))
-        self.failUnless(s.startswith('-0'))
-        self.assertEquals(len(s), size)
-        self.assertEquals(s.count('0'), size - len(SUBSTR))
-
-    @bigmemtest(minsize=_2G + 10, memuse=2)
-    def test_format(self, size):
-        s = '-' * size
-        sf = '%s' % (s,)
-        self.failUnless(s == sf)
-        del sf
-        sf = '..%s..' % (s,)
-        self.assertEquals(len(sf), len(s) + 4)
-        self.failUnless(sf.startswith('..-'))
-        self.failUnless(sf.endswith('-..'))
-        del s, sf
-
-        size //= 2
-        edge = '-' * size
-        s = ''.join([edge, '%s', edge])
-        del edge
-        s = s % '...'
-        self.assertEquals(len(s), size * 2 + 3)
-        self.assertEquals(s.count('.'), 3)
-        self.assertEquals(s.count('-'), size * 2)
-
-    @bigmemtest(minsize=_2G + 10, memuse=2)
-    def test_repr_small(self, size):
-        s = '-' * size
-        s = repr(s)
-        self.assertEquals(len(s), size + 2)
-        self.assertEquals(s[0], "'")
-        self.assertEquals(s[-1], "'")
-        self.assertEquals(s.count('-'), size)
-        del s
-        # repr() will create a string four times as large as this 'binary
-        # string', but we don't want to allocate much more than twice
-        # size in total.  (We do extra testing in test_repr_large())
-        size = size // 5 * 2
-        s = '\x00' * size
-        s = repr(s)
-        self.assertEquals(len(s), size * 4 + 2)
-        self.assertEquals(s[0], "'")
-        self.assertEquals(s[-1], "'")
-        self.assertEquals(s.count('\\'), size)
-        self.assertEquals(s.count('0'), size * 2)
-
-    @bigmemtest(minsize=_2G + 10, memuse=5)
-    def test_repr_large(self, size):
-        s = '\x00' * size
-        s = repr(s)
-        self.assertEquals(len(s), size * 4 + 2)
-        self.assertEquals(s[0], "'")
-        self.assertEquals(s[-1], "'")
-        self.assertEquals(s.count('\\'), size)
-        self.assertEquals(s.count('0'), size * 2)
-
-    # This test is meaningful even with size < 2G, as long as the
-    # doubled string is > 2G (but it tests more if both are > 2G :)
-    @bigmemtest(minsize=_1G + 2, memuse=3)
-    def test_concat(self, size):
-        s = '.' * size
-        self.assertEquals(len(s), size)
-        s = s + s
-        self.assertEquals(len(s), size * 2)
-        self.assertEquals(s.count('.'), size * 2)
-
-    # This test is meaningful even with size < 2G, as long as the
-    # repeated string is > 2G (but it tests more if both are > 2G :)
-    @bigmemtest(minsize=_1G + 2, memuse=3)
-    def test_repeat(self, size):
-        s = '.' * size
-        self.assertEquals(len(s), size)
-        s = s * 2
-        self.assertEquals(len(s), size * 2)
-        self.assertEquals(s.count('.'), size * 2)
-
-    @bigmemtest(minsize=_2G + 20, memuse=1)
-    def test_slice_and_getitem(self, size):
-        SUBSTR = '0123456789'
-        sublen = len(SUBSTR)
-        s = SUBSTR * (size // sublen)
-        stepsize = len(s) // 100
-        stepsize = stepsize - (stepsize % sublen)
-        for i in range(0, len(s) - stepsize, stepsize):
-            self.assertEquals(s[i], SUBSTR[0])
-            self.assertEquals(s[i:i + sublen], SUBSTR)
-            self.assertEquals(s[i:i + sublen:2], SUBSTR[::2])
-            if i > 0:
-                self.assertEquals(s[i + sublen - 1:i - 1:-3],
-                                  SUBSTR[sublen::-3])
-        # Make sure we do some slicing and indexing near the end of the
-        # string, too.
-        self.assertEquals(s[len(s) - 1], SUBSTR[-1])
-        self.assertEquals(s[-1], SUBSTR[-1])
-        self.assertEquals(s[len(s) - 10], SUBSTR[0])
-        self.assertEquals(s[-sublen], SUBSTR[0])
-        self.assertEquals(s[len(s):], '')
-        self.assertEquals(s[len(s) - 1:], SUBSTR[-1])
-        self.assertEquals(s[-1:], SUBSTR[-1])
-        self.assertEquals(s[len(s) - sublen:], SUBSTR)
-        self.assertEquals(s[-sublen:], SUBSTR)
-        self.assertEquals(len(s[:]), len(s))
-        self.assertEquals(len(s[:len(s) - 5]), len(s) - 5)
-        self.assertEquals(len(s[5:-5]), len(s) - 10)
-
-        self.assertRaises(IndexError, operator.getitem, s, len(s))
-        self.assertRaises(IndexError, operator.getitem, s, len(s) + 1)
-        self.assertRaises(IndexError, operator.getitem, s, len(s) + 1<<31)
-
-    @bigmemtest(minsize=_2G, memuse=2)
-    def test_contains(self, size):
-        SUBSTR = '0123456789'
-        edge = '-' * (size // 2)
-        s = ''.join([edge, SUBSTR, edge])
-        del edge
-        self.failUnless(SUBSTR in s)
-        self.failIf(SUBSTR * 2 in s)
-        self.failUnless('-' in s)
-        self.failIf('a' in s)
-        s += 'a'
-        self.failUnless('a' in s)
-
-    @bigmemtest(minsize=_2G + 10, memuse=2)
-    def test_compare(self, size):
-        s1 = '-' * size
-        s2 = '-' * size
-        self.failUnless(s1 == s2)
-        del s2
-        s2 = s1 + 'a'
-        self.failIf(s1 == s2)
-        del s2
-        s2 = '.' * size
-        self.failIf(s1 == s2)
-
-    @bigmemtest(minsize=_2G + 10, memuse=1)
-    def test_hash(self, size):
-        # Not sure if we can do any meaningful tests here...  Even if we
-        # start relying on the exact algorithm used, the result will be
-        # different depending on the size of the C 'long int'.  Even this
-        # test is dodgy (there's no *guarantee* that the two things should
-        # have a different hash, even if they, in the current
-        # implementation, almost always do.)
-        s = '\x00' * size
-        h1 = hash(s)
-        del s
-        s = '\x00' * (size + 1)
-        self.failIf(h1 == hash(s))
-
-class TupleTest(unittest.TestCase):
-
-    # Tuples have a small, fixed-sized head and an array of pointers to
-    # data.  Since we're testing 64-bit addressing, we can assume that the
-    # pointers are 8 bytes, and that thus that the tuples take up 8 bytes
-    # per size.
-
-    # As a side-effect of testing long tuples, these tests happen to test
-    # having more than 2<<31 references to any given object. Hence the
-    # use of different types of objects as contents in different tests.
-
-    @bigmemtest(minsize=_2G + 2, memuse=16)
-    def test_compare(self, size):
-        t1 = (u'',) * size
-        t2 = (u'',) * size
-        self.failUnless(t1 == t2)
-        del t2
-        t2 = (u'',) * (size + 1)
-        self.failIf(t1 == t2)
-        del t2
-        t2 = (1,) * size
-        self.failIf(t1 == t2)
-
-    # Test concatenating into a single tuple of more than 2G in length,
-    # and concatenating a tuple of more than 2G in length separately, so
-    # the smaller test still gets run even if there isn't memory for the
-    # larger test (but we still let the tester know the larger test is
-    # skipped, in verbose mode.)
-    def basic_concat_test(self, size):
-        t = ((),) * size
-        self.assertEquals(len(t), size)
-        t = t + t
-        self.assertEquals(len(t), size * 2)
-
-    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
-    def test_concat_small(self, size):
-        return self.basic_concat_test(size)
-
-    @bigmemtest(minsize=_2G + 2, memuse=24)
-    def test_concat_large(self, size):
-        return self.basic_concat_test(size)
-
-    @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
-    def test_contains(self, size):
-        t = (1, 2, 3, 4, 5) * size
-        self.assertEquals(len(t), size * 5)
-        self.failUnless(5 in t)
-        self.failIf((1, 2, 3, 4, 5) in t)
-        self.failIf(0 in t)
-
-    @bigmemtest(minsize=_2G + 10, memuse=8)
-    def test_hash(self, size):
-        t1 = (0,) * size
-        h1 = hash(t1)
-        del t1
-        t2 = (0,) * (size + 1)
-        self.failIf(h1 == hash(t2))
-
-    @bigmemtest(minsize=_2G + 10, memuse=8)
-    def test_index_and_slice(self, size):
-        t = (None,) * size
-        self.assertEquals(len(t), size)
-        self.assertEquals(t[-1], None)
-        self.assertEquals(t[5], None)
-        self.assertEquals(t[size - 1], None)
-        self.assertRaises(IndexError, operator.getitem, t, size)
-        self.assertEquals(t[:5], (None,) * 5)
-        self.assertEquals(t[-5:], (None,) * 5)
-        self.assertEquals(t[20:25], (None,) * 5)
-        self.assertEquals(t[-25:-20], (None,) * 5)
-        self.assertEquals(t[size - 5:], (None,) * 5)
-        self.assertEquals(t[size - 5:size], (None,) * 5)
-        self.assertEquals(t[size - 6:size - 2], (None,) * 4)
-        self.assertEquals(t[size:size], ())
-        self.assertEquals(t[size:size+5], ())
-
-    # Like test_concat, split in two.
-    def basic_test_repeat(self, size):
-        t = ('',) * size
-        self.assertEquals(len(t), size)
-        t = t * 2
-        self.assertEquals(len(t), size * 2)
-
-    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
-    def test_repeat_small(self, size):
-        return self.basic_test_repeat(size)
-
-    @bigmemtest(minsize=_2G + 2, memuse=24)
-    def test_repeat_large(self, size):
-        return self.basic_test_repeat(size)
-
-    # Like test_concat, split in two.
-    def basic_test_repr(self, size):
-        t = (0,) * size
-        s = repr(t)
-        # The repr of a tuple of 0's is exactly three times the tuple length.
-        self.assertEquals(len(s), size * 3)
-        self.assertEquals(s[:5], '(0, 0')
-        self.assertEquals(s[-5:], '0, 0)')
-        self.assertEquals(s.count('0'), size)
-
-    @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
-    def test_repr_small(self, size):
-        return self.basic_test_repr(size)
-
-    @bigmemtest(minsize=_2G + 2, memuse=8 + 3)
-    def test_repr_large(self, size):
-        return self.basic_test_repr(size)
-
-class ListTest(unittest.TestCase):
-
-    # Like tuples, lists have a small, fixed-sized head and an array of
-    # pointers to data, so 8 bytes per size. Also like tuples, we make the
-    # lists hold references to various objects to test their refcount
-    # limits.
-
-    @bigmemtest(minsize=_2G + 2, memuse=16)
-    def test_compare(self, size):
-        l1 = [u''] * size
-        l2 = [u''] * size
-        self.failUnless(l1 == l2)
-        del l2
-        l2 = [u''] * (size + 1)
-        self.failIf(l1 == l2)
-        del l2
-        l2 = [2] * size
-        self.failIf(l1 == l2)
-
-    # Test concatenating into a single list of more than 2G in length,
-    # and concatenating a list of more than 2G in length separately, so
-    # the smaller test still gets run even if there isn't memory for the
-    # larger test (but we still let the tester know the larger test is
-    # skipped, in verbose mode.)
-    def basic_test_concat(self, size):
-        l = [[]] * size
-        self.assertEquals(len(l), size)
-        l = l + l
-        self.assertEquals(len(l), size * 2)
-
-    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
-    def test_concat_small(self, size):
-        return self.basic_test_concat(size)
-
-    @bigmemtest(minsize=_2G + 2, memuse=24)
-    def test_concat_large(self, size):
-        return self.basic_test_concat(size)
-
-    def basic_test_inplace_concat(self, size):
-        l = [sys.stdout] * size
-        l += l
-        self.assertEquals(len(l), size * 2)
-        self.failUnless(l[0] is l[-1])
-        self.failUnless(l[size - 1] is l[size + 1])
-
-    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
-    def test_inplace_concat_small(self, size):
-        return self.basic_test_inplace_concat(size)
-
-    @bigmemtest(minsize=_2G + 2, memuse=24)
-    def test_inplace_concat_large(self, size):
-        return self.basic_test_inplace_concat(size)
-
-    @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
-    def test_contains(self, size):
-        l = [1, 2, 3, 4, 5] * size
-        self.assertEquals(len(l), size * 5)
-        self.failUnless(5 in l)
-        self.failIf([1, 2, 3, 4, 5] in l)
-        self.failIf(0 in l)
-
-    @bigmemtest(minsize=_2G + 10, memuse=8)
-    def test_hash(self, size):
-        l = [0] * size
-        self.failUnlessRaises(TypeError, hash, l)
-
-    @bigmemtest(minsize=_2G + 10, memuse=8)
-    def test_index_and_slice(self, size):
-        l = [None] * size
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[-1], None)
-        self.assertEquals(l[5], None)
-        self.assertEquals(l[size - 1], None)
-        self.assertRaises(IndexError, operator.getitem, l, size)
-        self.assertEquals(l[:5], [None] * 5)
-        self.assertEquals(l[-5:], [None] * 5)
-        self.assertEquals(l[20:25], [None] * 5)
-        self.assertEquals(l[-25:-20], [None] * 5)
-        self.assertEquals(l[size - 5:], [None] * 5)
-        self.assertEquals(l[size - 5:size], [None] * 5)
-        self.assertEquals(l[size - 6:size - 2], [None] * 4)
-        self.assertEquals(l[size:size], [])
-        self.assertEquals(l[size:size+5], [])
-
-        l[size - 2] = 5
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[-3:], [None, 5, None])
-        self.assertEquals(l.count(5), 1)
-        self.assertRaises(IndexError, operator.setitem, l, size, 6)
-        self.assertEquals(len(l), size)
-
-        l[size - 7:] = [1, 2, 3, 4, 5]
-        size -= 2
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[-7:], [None, None, 1, 2, 3, 4, 5])
-
-        l[:7] = [1, 2, 3, 4, 5]
-        size -= 2
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[:7], [1, 2, 3, 4, 5, None, None])
-
-        del l[size - 1]
-        size -= 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[-1], 4)
-
-        del l[-2:]
-        size -= 2
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[-1], 2)
-
-        del l[0]
-        size -= 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[0], 2)
-
-        del l[:2]
-        size -= 2
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[0], 4)
-
-    # Like test_concat, split in two.
-    def basic_test_repeat(self, size):
-        l = [] * size
-        self.failIf(l)
-        l = [''] * size
-        self.assertEquals(len(l), size)
-        l = l * 2
-        self.assertEquals(len(l), size * 2)
-
-    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
-    def test_repeat_small(self, size):
-        return self.basic_test_repeat(size)
-
-    @bigmemtest(minsize=_2G + 2, memuse=24)
-    def test_repeat_large(self, size):
-        return self.basic_test_repeat(size)
-
-    def basic_test_inplace_repeat(self, size):
-        l = ['']
-        l *= size
-        self.assertEquals(len(l), size)
-        self.failUnless(l[0] is l[-1])
-        del l
-
-        l = [''] * size
-        l *= 2
-        self.assertEquals(len(l), size * 2)
-        self.failUnless(l[size - 1] is l[-1])
-
-    @bigmemtest(minsize=_2G // 2 + 2, memuse=16)
-    def test_inplace_repeat_small(self, size):
-        return self.basic_test_inplace_repeat(size)
-
-    @bigmemtest(minsize=_2G + 2, memuse=16)
-    def test_inplace_repeat_large(self, size):
-        return self.basic_test_inplace_repeat(size)
-
-    def basic_test_repr(self, size):
-        l = [0] * size
-        s = repr(l)
-        # The repr of a list of 0's is exactly three times the list length.
-        self.assertEquals(len(s), size * 3)
-        self.assertEquals(s[:5], '[0, 0')
-        self.assertEquals(s[-5:], '0, 0]')
-        self.assertEquals(s.count('0'), size)
-
-    @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
-    def test_repr_small(self, size):
-        return self.basic_test_repr(size)
-
-    @bigmemtest(minsize=_2G + 2, memuse=8 + 3)
-    def test_repr_large(self, size):
-        return self.basic_test_repr(size)
-
-    # list overallocates ~1/8th of the total size (on first expansion) so
-    # the single list.append call puts memuse at 9 bytes per size.
-    @bigmemtest(minsize=_2G, memuse=9)
-    def test_append(self, size):
-        l = [object()] * size
-        l.append(object())
-        self.assertEquals(len(l), size+1)
-        self.failUnless(l[-3] is l[-2])
-        self.failIf(l[-2] is l[-1])
-
-    @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
-    def test_count(self, size):
-        l = [1, 2, 3, 4, 5] * size
-        self.assertEquals(l.count(1), size)
-        self.assertEquals(l.count("1"), 0)
-
-    def basic_test_extend(self, size):
-        l = [file] * size
-        l.extend(l)
-        self.assertEquals(len(l), size * 2)
-        self.failUnless(l[0] is l[-1])
-        self.failUnless(l[size - 1] is l[size + 1])
-
-    @bigmemtest(minsize=_2G // 2 + 2, memuse=16)
-    def test_extend_small(self, size):
-        return self.basic_test_extend(size)
-
-    @bigmemtest(minsize=_2G + 2, memuse=16)
-    def test_extend_large(self, size):
-        return self.basic_test_extend(size)
-
-    @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
-    def test_index(self, size):
-        l = [1L, 2L, 3L, 4L, 5L] * size
-        size *= 5
-        self.assertEquals(l.index(1), 0)
-        self.assertEquals(l.index(5, size - 5), size - 1)
-        self.assertEquals(l.index(5, size - 5, size), size - 1)
-        self.assertRaises(ValueError, l.index, 1, size - 4, size)
-        self.assertRaises(ValueError, l.index, 6L)
-
-    # This tests suffers from overallocation, just like test_append.
-    @bigmemtest(minsize=_2G + 10, memuse=9)
-    def test_insert(self, size):
-        l = [1.0] * size
-        l.insert(size - 1, "A")
-        size += 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[-3:], [1.0, "A", 1.0])
-
-        l.insert(size + 1, "B")
-        size += 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[-3:], ["A", 1.0, "B"])
-
-        l.insert(1, "C")
-        size += 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[:3], [1.0, "C", 1.0])
-        self.assertEquals(l[size - 3:], ["A", 1.0, "B"])
-
-    @bigmemtest(minsize=_2G // 5 + 4, memuse=8 * 5)
-    def test_pop(self, size):
-        l = [u"a", u"b", u"c", u"d", u"e"] * size
-        size *= 5
-        self.assertEquals(len(l), size)
-
-        item = l.pop()
-        size -= 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(item, u"e")
-        self.assertEquals(l[-2:], [u"c", u"d"])
-
-        item = l.pop(0)
-        size -= 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(item, u"a")
-        self.assertEquals(l[:2], [u"b", u"c"])
-
-        item = l.pop(size - 2)
-        size -= 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(item, u"c")
-        self.assertEquals(l[-2:], [u"b", u"d"])
-
-    @bigmemtest(minsize=_2G + 10, memuse=8)
-    def test_remove(self, size):
-        l = [10] * size
-        self.assertEquals(len(l), size)
-
-        l.remove(10)
-        size -= 1
-        self.assertEquals(len(l), size)
-
-        # Because of the earlier l.remove(), this append doesn't trigger
-        # a resize.
-        l.append(5)
-        size += 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[-2:], [10, 5])
-        l.remove(5)
-        size -= 1
-        self.assertEquals(len(l), size)
-        self.assertEquals(l[-2:], [10, 10])
-
-    @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
-    def test_reverse(self, size):
-        l = [1, 2, 3, 4, 5] * size
-        l.reverse()
-        self.assertEquals(len(l), size * 5)
-        self.assertEquals(l[-5:], [5, 4, 3, 2, 1])
-        self.assertEquals(l[:5], [5, 4, 3, 2, 1])
-
-    @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
-    def test_sort(self, size):
-        l = [1, 2, 3, 4, 5] * size
-        l.sort()
-        self.assertEquals(len(l), size * 5)
-        self.assertEquals(l.count(1), size)
-        self.assertEquals(l[:10], [1] * 10)
-        self.assertEquals(l[-10:], [5] * 10)
-
-def test_main():
-    test_support.run_unittest(StrTest, TupleTest, ListTest)
-
-if __name__ == '__main__':
-    if len(sys.argv) > 1:
-        test_support.set_memlimit(sys.argv[1])
-    test_main()
+from test import test_support
+from test.test_support import bigmemtest, _1G, _2G
+
+import unittest
+import operator
+import string
+import sys
+
+# Bigmem testing houserules:
+#
+#  - Try not to allocate too many large objects. It's okay to rely on
+#    refcounting semantics, but don't forget that 's = create_largestring()'
+#    doesn't release the old 's' (if it exists) until well after its new
+#    value has been created. Use 'del s' before the create_largestring call.
+#
+#  - Do *not* compare large objects using assertEquals or similar. It's a
+#    lengty operation and the errormessage will be utterly useless due to
+#    its size. To make sure whether a result has the right contents, better
+#    to use the strip or count methods, or compare meaningful slices.
+#
+#  - Don't forget to test for large indices, offsets and results and such,
+#    in addition to large sizes.
+#
+#  - When repeating an object (say, a substring, or a small list) to create
+#    a large object, make the subobject of a length that is not a power of
+#    2. That way, int-wrapping problems are more easily detected.
+#
+#  - While the bigmemtest decorator speaks of 'minsize', all tests will
+#    actually be called with a much smaller number too, in the normal
+#    test run (5Kb currently.) This is so the tests themselves get frequent
+#    testing Consequently, always make all large allocations based on the
+#    passed-in 'size', and don't rely on the size being very large. Also,
+#    memuse-per-size should remain sane (less than a few thousand); if your
+#    test uses more, adjust 'size' upward, instead.
+
+class StrTest(unittest.TestCase):
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_capitalize(self, size):
+        SUBSTR = ' abc def ghi'
+        s = '-' * size + SUBSTR
+        caps = s.capitalize()
+        self.assertEquals(caps[-len(SUBSTR):],
+                         SUBSTR.capitalize())
+        self.assertEquals(caps.lstrip('-'), SUBSTR)
+
+    @bigmemtest(minsize=_2G + 10, memuse=1)
+    def test_center(self, size):
+        SUBSTR = ' abc def ghi'
+        s = SUBSTR.center(size)
+        self.assertEquals(len(s), size)
+        lpadsize = rpadsize = (len(s) - len(SUBSTR)) // 2
+        if len(s) % 2:
+            lpadsize += 1
+        self.assertEquals(s[lpadsize:-rpadsize], SUBSTR)
+        self.assertEquals(s.strip(), SUBSTR.strip())
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_count(self, size):
+        SUBSTR = ' abc def ghi'
+        s = '.' * size + SUBSTR
+        self.assertEquals(s.count('.'), size)
+        s += '.'
+        self.assertEquals(s.count('.'), size + 1)
+        self.assertEquals(s.count(' '), 3)
+        self.assertEquals(s.count('i'), 1)
+        self.assertEquals(s.count('j'), 0)
+
+    @bigmemtest(minsize=0, memuse=1)
+    def test_decode(self, size):
+        pass
+
+    @bigmemtest(minsize=0, memuse=1)
+    def test_encode(self, size):
+        pass
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_endswith(self, size):
+        SUBSTR = ' abc def ghi'
+        s = '-' * size + SUBSTR
+        self.failUnless(s.endswith(SUBSTR))
+        self.failUnless(s.endswith(s))
+        s2 = '...' + s
+        self.failUnless(s2.endswith(s))
+        self.failIf(s.endswith('a' + SUBSTR))
+        self.failIf(SUBSTR.endswith(s))
+
+    @bigmemtest(minsize=_2G + 10, memuse=2)
+    def test_expandtabs(self, size):
+        s = '-' * size
+        tabsize = 8
+        self.assertEquals(s.expandtabs(), s)
+        del s
+        slen, remainder = divmod(size, tabsize)
+        s = '       \t' * slen
+        s = s.expandtabs(tabsize)
+        self.assertEquals(len(s), size - remainder)
+        self.assertEquals(len(s.strip(' ')), 0)
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_find(self, size):
+        SUBSTR = ' abc def ghi'
+        sublen = len(SUBSTR)
+        s = ''.join([SUBSTR, '-' * size, SUBSTR])
+        self.assertEquals(s.find(' '), 0)
+        self.assertEquals(s.find(SUBSTR), 0)
+        self.assertEquals(s.find(' ', sublen), sublen + size)
+        self.assertEquals(s.find(SUBSTR, len(SUBSTR)), sublen + size)
+        self.assertEquals(s.find('i'), SUBSTR.find('i'))
+        self.assertEquals(s.find('i', sublen),
+                         sublen + size + SUBSTR.find('i'))
+        self.assertEquals(s.find('i', size),
+                         sublen + size + SUBSTR.find('i'))
+        self.assertEquals(s.find('j'), -1)
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_index(self, size):
+        SUBSTR = ' abc def ghi'
+        sublen = len(SUBSTR)
+        s = ''.join([SUBSTR, '-' * size, SUBSTR])
+        self.assertEquals(s.index(' '), 0)
+        self.assertEquals(s.index(SUBSTR), 0)
+        self.assertEquals(s.index(' ', sublen), sublen + size)
+        self.assertEquals(s.index(SUBSTR, sublen), sublen + size)
+        self.assertEquals(s.index('i'), SUBSTR.index('i'))
+        self.assertEquals(s.index('i', sublen),
+                         sublen + size + SUBSTR.index('i'))
+        self.assertEquals(s.index('i', size),
+                         sublen + size + SUBSTR.index('i'))
+        self.assertRaises(ValueError, s.index, 'j')
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_isalnum(self, size):
+        SUBSTR = '123456'
+        s = 'a' * size + SUBSTR
+        self.failUnless(s.isalnum())
+        s += '.'
+        self.failIf(s.isalnum())
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_isalpha(self, size):
+        SUBSTR = 'zzzzzzz'
+        s = 'a' * size + SUBSTR
+        self.failUnless(s.isalpha())
+        s += '.'
+        self.failIf(s.isalpha())
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_isdigit(self, size):
+        SUBSTR = '123456'
+        s = '9' * size + SUBSTR
+        self.failUnless(s.isdigit())
+        s += 'z'
+        self.failIf(s.isdigit())
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_islower(self, size):
+        chars = ''.join([ chr(c) for c in range(255) if not chr(c).isupper() ])
+        repeats = size // len(chars) + 2
+        s = chars * repeats
+        self.failUnless(s.islower())
+        s += 'A'
+        self.failIf(s.islower())
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_isspace(self, size):
+        whitespace = ' \f\n\r\t\v'
+        repeats = size // len(whitespace) + 2
+        s = whitespace * repeats
+        self.failUnless(s.isspace())
+        s += 'j'
+        self.failIf(s.isspace())
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_istitle(self, size):
+        SUBSTR = '123456'
+        s = ''.join(['A', 'a' * size, SUBSTR])
+        self.failUnless(s.istitle())
+        s += 'A'
+        self.failUnless(s.istitle())
+        s += 'aA'
+        self.failIf(s.istitle())
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_isupper(self, size):
+        chars = ''.join([ chr(c) for c in range(255) if not chr(c).islower() ])
+        repeats = size // len(chars) + 2
+        s = chars * repeats
+        self.failUnless(s.isupper())
+        s += 'a'
+        self.failIf(s.isupper())
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_join(self, size):
+        s = 'A' * size
+        x = s.join(['aaaaa', 'bbbbb'])
+        self.assertEquals(x.count('a'), 5)
+        self.assertEquals(x.count('b'), 5)
+        self.failUnless(x.startswith('aaaaaA'))
+        self.failUnless(x.endswith('Abbbbb'))
+
+    @bigmemtest(minsize=_2G + 10, memuse=1)
+    def test_ljust(self, size):
+        SUBSTR = ' abc def ghi'
+        s = SUBSTR.ljust(size)
+        self.failUnless(s.startswith(SUBSTR + '  '))
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.strip(), SUBSTR.strip())
+
+    @bigmemtest(minsize=_2G + 10, memuse=2)
+    def test_lower(self, size):
+        s = 'A' * size
+        s = s.lower()
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.count('a'), size)
+
+    @bigmemtest(minsize=_2G + 10, memuse=1)
+    def test_lstrip(self, size):
+        SUBSTR = 'abc def ghi'
+        s = SUBSTR.rjust(size)
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.lstrip(), SUBSTR.lstrip())
+        del s
+        s = SUBSTR.ljust(size)
+        self.assertEquals(len(s), size)
+        stripped = s.lstrip()
+        self.failUnless(stripped is s)
+
+    @bigmemtest(minsize=_2G + 10, memuse=2)
+    def test_replace(self, size):
+        replacement = 'a'
+        s = ' ' * size
+        s = s.replace(' ', replacement)
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.count(replacement), size)
+        s = s.replace(replacement, ' ', size - 4)
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.count(replacement), 4)
+        self.assertEquals(s[-10:], '      aaaa')
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_rfind(self, size):
+        SUBSTR = ' abc def ghi'
+        sublen = len(SUBSTR)
+        s = ''.join([SUBSTR, '-' * size, SUBSTR])
+        self.assertEquals(s.rfind(' '), sublen + size + SUBSTR.rfind(' '))
+        self.assertEquals(s.rfind(SUBSTR), sublen + size)
+        self.assertEquals(s.rfind(' ', 0, size), SUBSTR.rfind(' '))
+        self.assertEquals(s.rfind(SUBSTR, 0, sublen + size), 0)
+        self.assertEquals(s.rfind('i'), sublen + size + SUBSTR.rfind('i'))
+        self.assertEquals(s.rfind('i', 0, sublen), SUBSTR.rfind('i'))
+        self.assertEquals(s.rfind('i', 0, sublen + size),
+                          SUBSTR.rfind('i'))
+        self.assertEquals(s.rfind('j'), -1)
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_rindex(self, size):
+        SUBSTR = ' abc def ghi'
+        sublen = len(SUBSTR)
+        s = ''.join([SUBSTR, '-' * size, SUBSTR])
+        self.assertEquals(s.rindex(' '),
+                          sublen + size + SUBSTR.rindex(' '))
+        self.assertEquals(s.rindex(SUBSTR), sublen + size)
+        self.assertEquals(s.rindex(' ', 0, sublen + size - 1),
+                          SUBSTR.rindex(' '))
+        self.assertEquals(s.rindex(SUBSTR, 0, sublen + size), 0)
+        self.assertEquals(s.rindex('i'),
+                          sublen + size + SUBSTR.rindex('i'))
+        self.assertEquals(s.rindex('i', 0, sublen), SUBSTR.rindex('i'))
+        self.assertEquals(s.rindex('i', 0, sublen + size),
+                          SUBSTR.rindex('i'))
+        self.assertRaises(ValueError, s.rindex, 'j')
+
+    @bigmemtest(minsize=_2G + 10, memuse=1)
+    def test_rjust(self, size):
+        SUBSTR = ' abc def ghi'
+        s = SUBSTR.ljust(size)
+        self.failUnless(s.startswith(SUBSTR + '  '))
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.strip(), SUBSTR.strip())
+
+    @bigmemtest(minsize=_2G + 10, memuse=1)
+    def test_rstrip(self, size):
+        SUBSTR = ' abc def ghi'
+        s = SUBSTR.ljust(size)
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.rstrip(), SUBSTR.rstrip())
+        del s
+        s = SUBSTR.rjust(size)
+        self.assertEquals(len(s), size)
+        stripped = s.rstrip()
+        self.failUnless(stripped is s)
+
+    # The test takes about size bytes to build a string, and then about
+    # sqrt(size) substrings of sqrt(size) in size and a list to
+    # hold sqrt(size) items. It's close but just over 2x size.
+    @bigmemtest(minsize=_2G, memuse=2.1)
+    def test_split_small(self, size):
+        # Crudely calculate an estimate so that the result of s.split won't
+        # take up an inordinate amount of memory
+        chunksize = int(size ** 0.5 + 2)
+        SUBSTR = 'a' + ' ' * chunksize
+        s = SUBSTR * chunksize
+        l = s.split()
+        self.assertEquals(len(l), chunksize)
+        self.assertEquals(set(l), set(['a']))
+        del l
+        l = s.split('a')
+        self.assertEquals(len(l), chunksize + 1)
+        self.assertEquals(set(l), set(['', ' ' * chunksize]))
+
+    # Allocates a string of twice size (and briefly two) and a list of
+    # size.  Because of internal affairs, the s.split() call produces a
+    # list of size times the same one-character string, so we only
+    # suffer for the list size. (Otherwise, it'd cost another 48 times
+    # size in bytes!) Nevertheless, a list of size takes
+    # 8*size bytes.
+    @bigmemtest(minsize=_2G + 5, memuse=10)
+    def test_split_large(self, size):
+        s = ' a' * size + ' '
+        l = s.split()
+        self.assertEquals(len(l), size)
+        self.assertEquals(set(l), set(['a']))
+        del l
+        l = s.split('a')
+        self.assertEquals(len(l), size + 1)
+        self.assertEquals(set(l), set([' ']))
+
+    @bigmemtest(minsize=_2G, memuse=2.1)
+    def test_splitlines(self, size):
+        # Crudely calculate an estimate so that the result of s.split won't
+        # take up an inordinate amount of memory
+        chunksize = int(size ** 0.5 + 2) // 2
+        SUBSTR = ' ' * chunksize + '\n' + ' ' * chunksize + '\r\n'
+        s = SUBSTR * chunksize
+        l = s.splitlines()
+        self.assertEquals(len(l), chunksize * 2)
+        self.assertEquals(set(l), set([' ' * chunksize]))
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_startswith(self, size):
+        SUBSTR = ' abc def ghi'
+        s = '-' * size + SUBSTR
+        self.failUnless(s.startswith(s))
+        self.failUnless(s.startswith('-' * size))
+        self.failIf(s.startswith(SUBSTR))
+
+    @bigmemtest(minsize=_2G, memuse=1)
+    def test_strip(self, size):
+        SUBSTR = '   abc def ghi   '
+        s = SUBSTR.rjust(size)
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.strip(), SUBSTR.strip())
+        del s
+        s = SUBSTR.ljust(size)
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.strip(), SUBSTR.strip())
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_swapcase(self, size):
+        SUBSTR = "aBcDeFG12.'\xa9\x00"
+        sublen = len(SUBSTR)
+        repeats = size // sublen + 2
+        s = SUBSTR * repeats
+        s = s.swapcase()
+        self.assertEquals(len(s), sublen * repeats)
+        self.assertEquals(s[:sublen * 3], SUBSTR.swapcase() * 3)
+        self.assertEquals(s[-sublen * 3:], SUBSTR.swapcase() * 3)
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_title(self, size):
+        SUBSTR = 'SpaaHAaaAaham'
+        s = SUBSTR * (size // len(SUBSTR) + 2)
+        s = s.title()
+        self.failUnless(s.startswith((SUBSTR * 3).title()))
+        self.failUnless(s.endswith(SUBSTR.lower() * 3))
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_translate(self, size):
+        trans = string.maketrans('.aZ', '-!$')
+        SUBSTR = 'aZz.z.Aaz.'
+        sublen = len(SUBSTR)
+        repeats = size // sublen + 2
+        s = SUBSTR * repeats
+        s = s.translate(trans)
+        self.assertEquals(len(s), repeats * sublen)
+        self.assertEquals(s[:sublen], SUBSTR.translate(trans))
+        self.assertEquals(s[-sublen:], SUBSTR.translate(trans))
+        self.assertEquals(s.count('.'), 0)
+        self.assertEquals(s.count('!'), repeats * 2)
+        self.assertEquals(s.count('z'), repeats * 3)
+
+    @bigmemtest(minsize=_2G + 5, memuse=2)
+    def test_upper(self, size):
+        s = 'a' * size
+        s = s.upper()
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.count('A'), size)
+
+    @bigmemtest(minsize=_2G + 20, memuse=1)
+    def test_zfill(self, size):
+        SUBSTR = '-568324723598234'
+        s = SUBSTR.zfill(size)
+        self.failUnless(s.endswith('0' + SUBSTR[1:]))
+        self.failUnless(s.startswith('-0'))
+        self.assertEquals(len(s), size)
+        self.assertEquals(s.count('0'), size - len(SUBSTR))
+
+    @bigmemtest(minsize=_2G + 10, memuse=2)
+    def test_format(self, size):
+        s = '-' * size
+        sf = '%s' % (s,)
+        self.failUnless(s == sf)
+        del sf
+        sf = '..%s..' % (s,)
+        self.assertEquals(len(sf), len(s) + 4)
+        self.failUnless(sf.startswith('..-'))
+        self.failUnless(sf.endswith('-..'))
+        del s, sf
+
+        size //= 2
+        edge = '-' * size
+        s = ''.join([edge, '%s', edge])
+        del edge
+        s = s % '...'
+        self.assertEquals(len(s), size * 2 + 3)
+        self.assertEquals(s.count('.'), 3)
+        self.assertEquals(s.count('-'), size * 2)
+
+    @bigmemtest(minsize=_2G + 10, memuse=2)
+    def test_repr_small(self, size):
+        s = '-' * size
+        s = repr(s)
+        self.assertEquals(len(s), size + 2)
+        self.assertEquals(s[0], "'")
+        self.assertEquals(s[-1], "'")
+        self.assertEquals(s.count('-'), size)
+        del s
+        # repr() will create a string four times as large as this 'binary
+        # string', but we don't want to allocate much more than twice
+        # size in total.  (We do extra testing in test_repr_large())
+        size = size // 5 * 2
+        s = '\x00' * size
+        s = repr(s)
+        self.assertEquals(len(s), size * 4 + 2)
+        self.assertEquals(s[0], "'")
+        self.assertEquals(s[-1], "'")
+        self.assertEquals(s.count('\\'), size)
+        self.assertEquals(s.count('0'), size * 2)
+
+    @bigmemtest(minsize=_2G + 10, memuse=5)
+    def test_repr_large(self, size):
+        s = '\x00' * size
+        s = repr(s)
+        self.assertEquals(len(s), size * 4 + 2)
+        self.assertEquals(s[0], "'")
+        self.assertEquals(s[-1], "'")
+        self.assertEquals(s.count('\\'), size)
+        self.assertEquals(s.count('0'), size * 2)
+
+    # This test is meaningful even with size < 2G, as long as the
+    # doubled string is > 2G (but it tests more if both are > 2G :)
+    @bigmemtest(minsize=_1G + 2, memuse=3)
+    def test_concat(self, size):
+        s = '.' * size
+        self.assertEquals(len(s), size)
+        s = s + s
+        self.assertEquals(len(s), size * 2)
+        self.assertEquals(s.count('.'), size * 2)
+
+    # This test is meaningful even with size < 2G, as long as the
+    # repeated string is > 2G (but it tests more if both are > 2G :)
+    @bigmemtest(minsize=_1G + 2, memuse=3)
+    def test_repeat(self, size):
+        s = '.' * size
+        self.assertEquals(len(s), size)
+        s = s * 2
+        self.assertEquals(len(s), size * 2)
+        self.assertEquals(s.count('.'), size * 2)
+
+    @bigmemtest(minsize=_2G + 20, memuse=1)
+    def test_slice_and_getitem(self, size):
+        SUBSTR = '0123456789'
+        sublen = len(SUBSTR)
+        s = SUBSTR * (size // sublen)
+        stepsize = len(s) // 100
+        stepsize = stepsize - (stepsize % sublen)
+        for i in range(0, len(s) - stepsize, stepsize):
+            self.assertEquals(s[i], SUBSTR[0])
+            self.assertEquals(s[i:i + sublen], SUBSTR)
+            self.assertEquals(s[i:i + sublen:2], SUBSTR[::2])
+            if i > 0:
+                self.assertEquals(s[i + sublen - 1:i - 1:-3],
+                                  SUBSTR[sublen::-3])
+        # Make sure we do some slicing and indexing near the end of the
+        # string, too.
+        self.assertEquals(s[len(s) - 1], SUBSTR[-1])
+        self.assertEquals(s[-1], SUBSTR[-1])
+        self.assertEquals(s[len(s) - 10], SUBSTR[0])
+        self.assertEquals(s[-sublen], SUBSTR[0])
+        self.assertEquals(s[len(s):], '')
+        self.assertEquals(s[len(s) - 1:], SUBSTR[-1])
+        self.assertEquals(s[-1:], SUBSTR[-1])
+        self.assertEquals(s[len(s) - sublen:], SUBSTR)
+        self.assertEquals(s[-sublen:], SUBSTR)
+        self.assertEquals(len(s[:]), len(s))
+        self.assertEquals(len(s[:len(s) - 5]), len(s) - 5)
+        self.assertEquals(len(s[5:-5]), len(s) - 10)
+
+        self.assertRaises(IndexError, operator.getitem, s, len(s))
+        self.assertRaises(IndexError, operator.getitem, s, len(s) + 1)
+        self.assertRaises(IndexError, operator.getitem, s, len(s) + 1<<31)
+
+    @bigmemtest(minsize=_2G, memuse=2)
+    def test_contains(self, size):
+        SUBSTR = '0123456789'
+        edge = '-' * (size // 2)
+        s = ''.join([edge, SUBSTR, edge])
+        del edge
+        self.failUnless(SUBSTR in s)
+        self.failIf(SUBSTR * 2 in s)
+        self.failUnless('-' in s)
+        self.failIf('a' in s)
+        s += 'a'
+        self.failUnless('a' in s)
+
+    @bigmemtest(minsize=_2G + 10, memuse=2)
+    def test_compare(self, size):
+        s1 = '-' * size
+        s2 = '-' * size
+        self.failUnless(s1 == s2)
+        del s2
+        s2 = s1 + 'a'
+        self.failIf(s1 == s2)
+        del s2
+        s2 = '.' * size
+        self.failIf(s1 == s2)
+
+    @bigmemtest(minsize=_2G + 10, memuse=1)
+    def test_hash(self, size):
+        # Not sure if we can do any meaningful tests here...  Even if we
+        # start relying on the exact algorithm used, the result will be
+        # different depending on the size of the C 'long int'.  Even this
+        # test is dodgy (there's no *guarantee* that the two things should
+        # have a different hash, even if they, in the current
+        # implementation, almost always do.)
+        s = '\x00' * size
+        h1 = hash(s)
+        del s
+        s = '\x00' * (size + 1)
+        self.failIf(h1 == hash(s))
+
+class TupleTest(unittest.TestCase):
+
+    # Tuples have a small, fixed-sized head and an array of pointers to
+    # data.  Since we're testing 64-bit addressing, we can assume that the
+    # pointers are 8 bytes, and that thus that the tuples take up 8 bytes
+    # per size.
+
+    # As a side-effect of testing long tuples, these tests happen to test
+    # having more than 2<<31 references to any given object. Hence the
+    # use of different types of objects as contents in different tests.
+
+    @bigmemtest(minsize=_2G + 2, memuse=16)
+    def test_compare(self, size):
+        t1 = (u'',) * size
+        t2 = (u'',) * size
+        self.failUnless(t1 == t2)
+        del t2
+        t2 = (u'',) * (size + 1)
+        self.failIf(t1 == t2)
+        del t2
+        t2 = (1,) * size
+        self.failIf(t1 == t2)
+
+    # Test concatenating into a single tuple of more than 2G in length,
+    # and concatenating a tuple of more than 2G in length separately, so
+    # the smaller test still gets run even if there isn't memory for the
+    # larger test (but we still let the tester know the larger test is
+    # skipped, in verbose mode.)
+    def basic_concat_test(self, size):
+        t = ((),) * size
+        self.assertEquals(len(t), size)
+        t = t + t
+        self.assertEquals(len(t), size * 2)
+
+    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
+    def test_concat_small(self, size):
+        return self.basic_concat_test(size)
+
+    @bigmemtest(minsize=_2G + 2, memuse=24)
+    def test_concat_large(self, size):
+        return self.basic_concat_test(size)
+
+    @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
+    def test_contains(self, size):
+        t = (1, 2, 3, 4, 5) * size
+        self.assertEquals(len(t), size * 5)
+        self.failUnless(5 in t)
+        self.failIf((1, 2, 3, 4, 5) in t)
+        self.failIf(0 in t)
+
+    @bigmemtest(minsize=_2G + 10, memuse=8)
+    def test_hash(self, size):
+        t1 = (0,) * size
+        h1 = hash(t1)
+        del t1
+        t2 = (0,) * (size + 1)
+        self.failIf(h1 == hash(t2))
+
+    @bigmemtest(minsize=_2G + 10, memuse=8)
+    def test_index_and_slice(self, size):
+        t = (None,) * size
+        self.assertEquals(len(t), size)
+        self.assertEquals(t[-1], None)
+        self.assertEquals(t[5], None)
+        self.assertEquals(t[size - 1], None)
+        self.assertRaises(IndexError, operator.getitem, t, size)
+        self.assertEquals(t[:5], (None,) * 5)
+        self.assertEquals(t[-5:], (None,) * 5)
+        self.assertEquals(t[20:25], (None,) * 5)
+        self.assertEquals(t[-25:-20], (None,) * 5)
+        self.assertEquals(t[size - 5:], (None,) * 5)
+        self.assertEquals(t[size - 5:size], (None,) * 5)
+        self.assertEquals(t[size - 6:size - 2], (None,) * 4)
+        self.assertEquals(t[size:size], ())
+        self.assertEquals(t[size:size+5], ())
+
+    # Like test_concat, split in two.
+    def basic_test_repeat(self, size):
+        t = ('',) * size
+        self.assertEquals(len(t), size)
+        t = t * 2
+        self.assertEquals(len(t), size * 2)
+
+    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
+    def test_repeat_small(self, size):
+        return self.basic_test_repeat(size)
+
+    @bigmemtest(minsize=_2G + 2, memuse=24)
+    def test_repeat_large(self, size):
+        return self.basic_test_repeat(size)
+
+    # Like test_concat, split in two.
+    def basic_test_repr(self, size):
+        t = (0,) * size
+        s = repr(t)
+        # The repr of a tuple of 0's is exactly three times the tuple length.
+        self.assertEquals(len(s), size * 3)
+        self.assertEquals(s[:5], '(0, 0')
+        self.assertEquals(s[-5:], '0, 0)')
+        self.assertEquals(s.count('0'), size)
+
+    @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
+    def test_repr_small(self, size):
+        return self.basic_test_repr(size)
+
+    @bigmemtest(minsize=_2G + 2, memuse=8 + 3)
+    def test_repr_large(self, size):
+        return self.basic_test_repr(size)
+
+class ListTest(unittest.TestCase):
+
+    # Like tuples, lists have a small, fixed-sized head and an array of
+    # pointers to data, so 8 bytes per size. Also like tuples, we make the
+    # lists hold references to various objects to test their refcount
+    # limits.
+
+    @bigmemtest(minsize=_2G + 2, memuse=16)
+    def test_compare(self, size):
+        l1 = [u''] * size
+        l2 = [u''] * size
+        self.failUnless(l1 == l2)
+        del l2
+        l2 = [u''] * (size + 1)
+        self.failIf(l1 == l2)
+        del l2
+        l2 = [2] * size
+        self.failIf(l1 == l2)
+
+    # Test concatenating into a single list of more than 2G in length,
+    # and concatenating a list of more than 2G in length separately, so
+    # the smaller test still gets run even if there isn't memory for the
+    # larger test (but we still let the tester know the larger test is
+    # skipped, in verbose mode.)
+    def basic_test_concat(self, size):
+        l = [[]] * size
+        self.assertEquals(len(l), size)
+        l = l + l
+        self.assertEquals(len(l), size * 2)
+
+    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
+    def test_concat_small(self, size):
+        return self.basic_test_concat(size)
+
+    @bigmemtest(minsize=_2G + 2, memuse=24)
+    def test_concat_large(self, size):
+        return self.basic_test_concat(size)
+
+    def basic_test_inplace_concat(self, size):
+        l = [sys.stdout] * size
+        l += l
+        self.assertEquals(len(l), size * 2)
+        self.failUnless(l[0] is l[-1])
+        self.failUnless(l[size - 1] is l[size + 1])
+
+    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
+    def test_inplace_concat_small(self, size):
+        return self.basic_test_inplace_concat(size)
+
+    @bigmemtest(minsize=_2G + 2, memuse=24)
+    def test_inplace_concat_large(self, size):
+        return self.basic_test_inplace_concat(size)
+
+    @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5)
+    def test_contains(self, size):
+        l = [1, 2, 3, 4, 5] * size
+        self.assertEquals(len(l), size * 5)
+        self.failUnless(5 in l)
+        self.failIf([1, 2, 3, 4, 5] in l)
+        self.failIf(0 in l)
+
+    @bigmemtest(minsize=_2G + 10, memuse=8)
+    def test_hash(self, size):
+        l = [0] * size
+        self.failUnlessRaises(TypeError, hash, l)
+
+    @bigmemtest(minsize=_2G + 10, memuse=8)
+    def test_index_and_slice(self, size):
+        l = [None] * size
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[-1], None)
+        self.assertEquals(l[5], None)
+        self.assertEquals(l[size - 1], None)
+        self.assertRaises(IndexError, operator.getitem, l, size)
+        self.assertEquals(l[:5], [None] * 5)
+        self.assertEquals(l[-5:], [None] * 5)
+        self.assertEquals(l[20:25], [None] * 5)
+        self.assertEquals(l[-25:-20], [None] * 5)
+        self.assertEquals(l[size - 5:], [None] * 5)
+        self.assertEquals(l[size - 5:size], [None] * 5)
+        self.assertEquals(l[size - 6:size - 2], [None] * 4)
+        self.assertEquals(l[size:size], [])
+        self.assertEquals(l[size:size+5], [])
+
+        l[size - 2] = 5
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[-3:], [None, 5, None])
+        self.assertEquals(l.count(5), 1)
+        self.assertRaises(IndexError, operator.setitem, l, size, 6)
+        self.assertEquals(len(l), size)
+
+        l[size - 7:] = [1, 2, 3, 4, 5]
+        size -= 2
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[-7:], [None, None, 1, 2, 3, 4, 5])
+
+        l[:7] = [1, 2, 3, 4, 5]
+        size -= 2
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[:7], [1, 2, 3, 4, 5, None, None])
+
+        del l[size - 1]
+        size -= 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[-1], 4)
+
+        del l[-2:]
+        size -= 2
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[-1], 2)
+
+        del l[0]
+        size -= 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[0], 2)
+
+        del l[:2]
+        size -= 2
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[0], 4)
+
+    # Like test_concat, split in two.
+    def basic_test_repeat(self, size):
+        l = [] * size
+        self.failIf(l)
+        l = [''] * size
+        self.assertEquals(len(l), size)
+        l = l * 2
+        self.assertEquals(len(l), size * 2)
+
+    @bigmemtest(minsize=_2G // 2 + 2, memuse=24)
+    def test_repeat_small(self, size):
+        return self.basic_test_repeat(size)
+
+    @bigmemtest(minsize=_2G + 2, memuse=24)
+    def test_repeat_large(self, size):
+        return self.basic_test_repeat(size)
+
+    def basic_test_inplace_repeat(self, size):
+        l = ['']
+        l *= size
+        self.assertEquals(len(l), size)
+        self.failUnless(l[0] is l[-1])
+        del l
+
+        l = [''] * size
+        l *= 2
+        self.assertEquals(len(l), size * 2)
+        self.failUnless(l[size - 1] is l[-1])
+
+    @bigmemtest(minsize=_2G // 2 + 2, memuse=16)
+    def test_inplace_repeat_small(self, size):
+        return self.basic_test_inplace_repeat(size)
+
+    @bigmemtest(minsize=_2G + 2, memuse=16)
+    def test_inplace_repeat_large(self, size):
+        return self.basic_test_inplace_repeat(size)
+
+    def basic_test_repr(self, size):
+        l = [0] * size
+        s = repr(l)
+        # The repr of a list of 0's is exactly three times the list length.
+        self.assertEquals(len(s), size * 3)
+        self.assertEquals(s[:5], '[0, 0')
+        self.assertEquals(s[-5:], '0, 0]')
+        self.assertEquals(s.count('0'), size)
+
+    @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3)
+    def test_repr_small(self, size):
+        return self.basic_test_repr(size)
+
+    @bigmemtest(minsize=_2G + 2, memuse=8 + 3)
+    def test_repr_large(self, size):
+        return self.basic_test_repr(size)
+
+    # list overallocates ~1/8th of the total size (on first expansion) so
+    # the single list.append call puts memuse at 9 bytes per size.
+    @bigmemtest(minsize=_2G, memuse=9)
+    def test_append(self, size):
+        l = [object()] * size
+        l.append(object())
+        self.assertEquals(len(l), size+1)
+        self.failUnless(l[-3] is l[-2])
+        self.failIf(l[-2] is l[-1])
+
+    @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
+    def test_count(self, size):
+        l = [1, 2, 3, 4, 5] * size
+        self.assertEquals(l.count(1), size)
+        self.assertEquals(l.count("1"), 0)
+
+    def basic_test_extend(self, size):
+        l = [file] * size
+        l.extend(l)
+        self.assertEquals(len(l), size * 2)
+        self.failUnless(l[0] is l[-1])
+        self.failUnless(l[size - 1] is l[size + 1])
+
+    @bigmemtest(minsize=_2G // 2 + 2, memuse=16)
+    def test_extend_small(self, size):
+        return self.basic_test_extend(size)
+
+    @bigmemtest(minsize=_2G + 2, memuse=16)
+    def test_extend_large(self, size):
+        return self.basic_test_extend(size)
+
+    @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
+    def test_index(self, size):
+        l = [1L, 2L, 3L, 4L, 5L] * size
+        size *= 5
+        self.assertEquals(l.index(1), 0)
+        self.assertEquals(l.index(5, size - 5), size - 1)
+        self.assertEquals(l.index(5, size - 5, size), size - 1)
+        self.assertRaises(ValueError, l.index, 1, size - 4, size)
+        self.assertRaises(ValueError, l.index, 6L)
+
+    # This tests suffers from overallocation, just like test_append.
+    @bigmemtest(minsize=_2G + 10, memuse=9)
+    def test_insert(self, size):
+        l = [1.0] * size
+        l.insert(size - 1, "A")
+        size += 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[-3:], [1.0, "A", 1.0])
+
+        l.insert(size + 1, "B")
+        size += 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[-3:], ["A", 1.0, "B"])
+
+        l.insert(1, "C")
+        size += 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[:3], [1.0, "C", 1.0])
+        self.assertEquals(l[size - 3:], ["A", 1.0, "B"])
+
+    @bigmemtest(minsize=_2G // 5 + 4, memuse=8 * 5)
+    def test_pop(self, size):
+        l = [u"a", u"b", u"c", u"d", u"e"] * size
+        size *= 5
+        self.assertEquals(len(l), size)
+
+        item = l.pop()
+        size -= 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(item, u"e")
+        self.assertEquals(l[-2:], [u"c", u"d"])
+
+        item = l.pop(0)
+        size -= 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(item, u"a")
+        self.assertEquals(l[:2], [u"b", u"c"])
+
+        item = l.pop(size - 2)
+        size -= 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(item, u"c")
+        self.assertEquals(l[-2:], [u"b", u"d"])
+
+    @bigmemtest(minsize=_2G + 10, memuse=8)
+    def test_remove(self, size):
+        l = [10] * size
+        self.assertEquals(len(l), size)
+
+        l.remove(10)
+        size -= 1
+        self.assertEquals(len(l), size)
+
+        # Because of the earlier l.remove(), this append doesn't trigger
+        # a resize.
+        l.append(5)
+        size += 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[-2:], [10, 5])
+        l.remove(5)
+        size -= 1
+        self.assertEquals(len(l), size)
+        self.assertEquals(l[-2:], [10, 10])
+
+    @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
+    def test_reverse(self, size):
+        l = [1, 2, 3, 4, 5] * size
+        l.reverse()
+        self.assertEquals(len(l), size * 5)
+        self.assertEquals(l[-5:], [5, 4, 3, 2, 1])
+        self.assertEquals(l[:5], [5, 4, 3, 2, 1])
+
+    @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5)
+    def test_sort(self, size):
+        l = [1, 2, 3, 4, 5] * size
+        l.sort()
+        self.assertEquals(len(l), size * 5)
+        self.assertEquals(l.count(1), size)
+        self.assertEquals(l[:10], [1] * 10)
+        self.assertEquals(l[-10:], [5] * 10)
+
+def test_main():
+    test_support.run_unittest(StrTest, TupleTest, ListTest)
+
+if __name__ == '__main__':
+    if len(sys.argv) > 1:
+        test_support.set_memlimit(sys.argv[1])
+    test_main()
