These test inputs are originally taken from the YUI compressor suite
(https://github.com/yui/yuicompressor/). The outputs (in the out/ directory) are
my own.

The YUI tests are licensed as follows:

===========================================================================
YUI Compressor Copyright License Agreement (BSD License)

Copyright (c) 2011, Yahoo! Inc.
All rights reserved.

Redistribution and use of this software in source and binary forms,
with or without modification, are permitted provided that the following
conditions are met:

* Redistributions of source code must retain the above
  copyright notice, this list of conditions and the
  following disclaimer.

* Redistributions in binary form must reproduce the above
  copyright notice, this list of conditions and the
  following disclaimer in the documentation and/or other
  materials provided with the distribution.

* Neither the name of Yahoo! Inc. nor the names of its
  contributors may be used to endorse or promote products
  derived from this software without specific prior
  written permission of Yahoo! Inc.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This software also requires access to software from the following sources:

The Jarg Library v 1.0 ( http://jargs.sourceforge.net/ ) is available
under a BSD License - Copyright (c) 2001-2003 Steve Purcell,
Copyright (c) 2002 Vidar Holen, Copyright (c) 2002 Michal Ceresna and
Copyright (c) 2005 Ewan Mellor.

The Rhino Library ( http://www.mozilla.org/rhino/ ) is dually available
under an MPL 1.1/GPL 2.0 license, with portions subject to a BSD license.

Additionally, this software contains modified versions of the following
component files from the Rhino Library:

[org/mozilla/javascript/Decompiler.java]
[org/mozilla/javascript/Parser.java]
[org/mozilla/javascript/Token.java]
[org/mozilla/javascript/TokenStream.java]

The modified versions of these files are distributed under the MPL v 1.1
( http://www.mozilla.org/MPL/MPL-1.1.html )
