Copyright (c) 2003-2008, Terence Parr. All rights reserved.