diff --git a/README.version b/README.version
new file mode 100644
index 0000000..0f07f97
--- /dev/null
+++ b/README.version
@@ -0,0 +1,3 @@
+URL: http://downloads.xiph.org/releases/flac/flac-1.2.1.tar.gz
+Version: 1.2.1
+BugComponent: 42195
diff --git a/include/FLAC/all.h b/include/FLAC/all.h
deleted file mode 100644
index 6f4d336..0000000
--- a/include/FLAC/all.h
+++ /dev/null
@@ -1,371 +0,0 @@
-/* libFLAC - Free Lossless Audio Codec library
- * Copyright (C) 2000-2009  Josh Coalson
- * Copyright (C) 2011-2014  Xiph.Org Foundation
- *
- * Redistribution and use 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 the Xiph.org Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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 FOUNDATION 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.
- */
-
-#ifndef FLAC__ALL_H
-#define FLAC__ALL_H
-
-#include "export.h"
-
-#include "assert.h"
-#include "callback.h"
-#include "format.h"
-#include "metadata.h"
-#include "ordinals.h"
-#include "stream_decoder.h"
-#include "stream_encoder.h"
-
-/** \mainpage
- *
- * \section intro Introduction
- *
- * This is the documentation for the FLAC C and C++ APIs.  It is
- * highly interconnected; this introduction should give you a top
- * level idea of the structure and how to find the information you
- * need.  As a prerequisite you should have at least a basic
- * knowledge of the FLAC format, documented
- * <A HREF="../format.html">here</A>.
- *
- * \section c_api FLAC C API
- *
- * The FLAC C API is the interface to libFLAC, a set of structures
- * describing the components of FLAC streams, and functions for
- * encoding and decoding streams, as well as manipulating FLAC
- * metadata in files.  The public include files will be installed
- * in your include area (for example /usr/include/FLAC/...).
- *
- * By writing a little code and linking against libFLAC, it is
- * relatively easy to add FLAC support to another program.  The
- * library is licensed under <A HREF="../license.html">Xiph's BSD license</A>.
- * Complete source code of libFLAC as well as the command-line
- * encoder and plugins is available and is a useful source of
- * examples.
- *
- * Aside from encoders and decoders, libFLAC provides a powerful
- * metadata interface for manipulating metadata in FLAC files.  It
- * allows the user to add, delete, and modify FLAC metadata blocks
- * and it can automatically take advantage of PADDING blocks to avoid
- * rewriting the entire FLAC file when changing the size of the
- * metadata.
- *
- * libFLAC usually only requires the standard C library and C math
- * library. In particular, threading is not used so there is no
- * dependency on a thread library. However, libFLAC does not use
- * global variables and should be thread-safe.
- *
- * libFLAC also supports encoding to and decoding from Ogg FLAC.
- * However the metadata editing interfaces currently have limited
- * read-only support for Ogg FLAC files.
- *
- * \section cpp_api FLAC C++ API
- *
- * The FLAC C++ API is a set of classes that encapsulate the
- * structures and functions in libFLAC.  They provide slightly more
- * functionality with respect to metadata but are otherwise
- * equivalent.  For the most part, they share the same usage as
- * their counterparts in libFLAC, and the FLAC C API documentation
- * can be used as a supplement.  The public include files
- * for the C++ API will be installed in your include area (for
- * example /usr/include/FLAC++/...).
- *
- * libFLAC++ is also licensed under
- * <A HREF="../license.html">Xiph's BSD license</A>.
- *
- * \section getting_started Getting Started
- *
- * A good starting point for learning the API is to browse through
- * the <A HREF="modules.html">modules</A>.  Modules are logical
- * groupings of related functions or classes, which correspond roughly
- * to header files or sections of header files.  Each module includes a
- * detailed description of the general usage of its functions or
- * classes.
- *
- * From there you can go on to look at the documentation of
- * individual functions.  You can see different views of the individual
- * functions through the links in top bar across this page.
- *
- * If you prefer a more hands-on approach, you can jump right to some
- * <A HREF="../documentation_example_code.html">example code</A>.
- *
- * \section porting_guide Porting Guide
- *
- * Starting with FLAC 1.1.3 a \link porting Porting Guide \endlink
- * has been introduced which gives detailed instructions on how to
- * port your code to newer versions of FLAC.
- *
- * \section embedded_developers Embedded Developers
- *
- * libFLAC has grown larger over time as more functionality has been
- * included, but much of it may be unnecessary for a particular embedded
- * implementation.  Unused parts may be pruned by some simple editing of
- * src/libFLAC/Makefile.am.  In general, the decoders, encoders, and
- * metadata interface are all independent from each other.
- *
- * It is easiest to just describe the dependencies:
- *
- * - All modules depend on the \link flac_format Format \endlink module.
- * - The decoders and encoders depend on the bitbuffer.
- * - The decoder is independent of the encoder.  The encoder uses the
- *   decoder because of the verify feature, but this can be removed if
- *   not needed.
- * - Parts of the metadata interface require the stream decoder (but not
- *   the encoder).
- * - Ogg support is selectable through the compile time macro
- *   \c FLAC__HAS_OGG.
- *
- * For example, if your application only requires the stream decoder, no
- * encoder, and no metadata interface, you can remove the stream encoder
- * and the metadata interface, which will greatly reduce the size of the
- * library.
- *
- * Also, there are several places in the libFLAC code with comments marked
- * with "OPT:" where a #define can be changed to enable code that might be
- * faster on a specific platform.  Experimenting with these can yield faster
- * binaries.
- */
-
-/** \defgroup porting Porting Guide for New Versions
- *
- * This module describes differences in the library interfaces from
- * version to version.  It assists in the porting of code that uses
- * the libraries to newer versions of FLAC.
- *
- * One simple facility for making porting easier that has been added
- * in FLAC 1.1.3 is a set of \c #defines in \c export.h of each
- * library's includes (e.g. \c include/FLAC/export.h).  The
- * \c #defines mirror the libraries'
- * <A HREF="http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning">libtool version numbers</A>,
- * e.g. in libFLAC there are \c FLAC_API_VERSION_CURRENT,
- * \c FLAC_API_VERSION_REVISION, and \c FLAC_API_VERSION_AGE.
- * These can be used to support multiple versions of an API during the
- * transition phase, e.g.
- *
- * \code
- * #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7
- *   legacy code
- * #else
- *   new code
- * #endif
- * \endcode
- *
- * The source will work for multiple versions and the legacy code can
- * easily be removed when the transition is complete.
- *
- * Another available symbol is FLAC_API_SUPPORTS_OGG_FLAC (defined in
- * include/FLAC/export.h), which can be used to determine whether or not
- * the library has been compiled with support for Ogg FLAC.  This is
- * simpler than trying to call an Ogg init function and catching the
- * error.
- */
-
-/** \defgroup porting_1_1_2_to_1_1_3 Porting from FLAC 1.1.2 to 1.1.3
- *  \ingroup porting
- *
- *  \brief
- *  This module describes porting from FLAC 1.1.2 to FLAC 1.1.3.
- *
- * The main change between the APIs in 1.1.2 and 1.1.3 is that they have
- * been simplified.  First, libOggFLAC has been merged into libFLAC and
- * libOggFLAC++ has been merged into libFLAC++.  Second, both the three
- * decoding layers and three encoding layers have been merged into a
- * single stream decoder and stream encoder.  That is, the functionality
- * of FLAC__SeekableStreamDecoder and FLAC__FileDecoder has been merged
- * into FLAC__StreamDecoder, and FLAC__SeekableStreamEncoder and
- * FLAC__FileEncoder into FLAC__StreamEncoder.  Only the
- * FLAC__StreamDecoder and FLAC__StreamEncoder remain.  What this means
- * is there is now a single API that can be used to encode or decode
- * streams to/from native FLAC or Ogg FLAC and the single API can work
- * on both seekable and non-seekable streams.
- *
- * Instead of creating an encoder or decoder of a certain layer, now the
- * client will always create a FLAC__StreamEncoder or
- * FLAC__StreamDecoder.  The old layers are now differentiated by the
- * initialization function.  For example, for the decoder,
- * FLAC__stream_decoder_init() has been replaced by
- * FLAC__stream_decoder_init_stream().  This init function takes
- * callbacks for the I/O, and the seeking callbacks are optional.  This
- * allows the client to use the same object for seekable and
- * non-seekable streams.  For decoding a FLAC file directly, the client
- * can use FLAC__stream_decoder_init_file() and pass just a filename
- * and fewer callbacks; most of the other callbacks are supplied
- * internally.  For situations where fopen()ing by filename is not
- * possible (e.g. Unicode filenames on Windows) the client can instead
- * open the file itself and supply the FILE* to
- * FLAC__stream_decoder_init_FILE().  The init functions now returns a
- * FLAC__StreamDecoderInitStatus instead of FLAC__StreamDecoderState.
- * Since the callbacks and client data are now passed to the init
- * function, the FLAC__stream_decoder_set_*_callback() functions and
- * FLAC__stream_decoder_set_client_data() are no longer needed.  The
- * rest of the calls to the decoder are the same as before.
- *
- * There are counterpart init functions for Ogg FLAC, e.g.
- * FLAC__stream_decoder_init_ogg_stream().  All the rest of the calls
- * and callbacks are the same as for native FLAC.
- *
- * As an example, in FLAC 1.1.2 a seekable stream decoder would have
- * been set up like so:
- *
- * \code
- * FLAC__SeekableStreamDecoder *decoder = FLAC__seekable_stream_decoder_new();
- * if(decoder == NULL) do_something;
- * FLAC__seekable_stream_decoder_set_md5_checking(decoder, true);
- * [... other settings ...]
- * FLAC__seekable_stream_decoder_set_read_callback(decoder, my_read_callback);
- * FLAC__seekable_stream_decoder_set_seek_callback(decoder, my_seek_callback);
- * FLAC__seekable_stream_decoder_set_tell_callback(decoder, my_tell_callback);
- * FLAC__seekable_stream_decoder_set_length_callback(decoder, my_length_callback);
- * FLAC__seekable_stream_decoder_set_eof_callback(decoder, my_eof_callback);
- * FLAC__seekable_stream_decoder_set_write_callback(decoder, my_write_callback);
- * FLAC__seekable_stream_decoder_set_metadata_callback(decoder, my_metadata_callback);
- * FLAC__seekable_stream_decoder_set_error_callback(decoder, my_error_callback);
- * FLAC__seekable_stream_decoder_set_client_data(decoder, my_client_data);
- * if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) do_something;
- * \endcode
- *
- * In FLAC 1.1.3 it is like this:
- *
- * \code
- * FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new();
- * if(decoder == NULL) do_something;
- * FLAC__stream_decoder_set_md5_checking(decoder, true);
- * [... other settings ...]
- * if(FLAC__stream_decoder_init_stream(
- *   decoder,
- *   my_read_callback,
- *   my_seek_callback,      // or NULL
- *   my_tell_callback,      // or NULL
- *   my_length_callback,    // or NULL
- *   my_eof_callback,       // or NULL
- *   my_write_callback,
- *   my_metadata_callback,  // or NULL
- *   my_error_callback,
- *   my_client_data
- * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something;
- * \endcode
- *
- * or you could do;
- *
- * \code
- * [...]
- * FILE *file = fopen("somefile.flac","rb");
- * if(file == NULL) do_somthing;
- * if(FLAC__stream_decoder_init_FILE(
- *   decoder,
- *   file,
- *   my_write_callback,
- *   my_metadata_callback,  // or NULL
- *   my_error_callback,
- *   my_client_data
- * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something;
- * \endcode
- *
- * or just:
- *
- * \code
- * [...]
- * if(FLAC__stream_decoder_init_file(
- *   decoder,
- *   "somefile.flac",
- *   my_write_callback,
- *   my_metadata_callback,  // or NULL
- *   my_error_callback,
- *   my_client_data
- * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something;
- * \endcode
- *
- * Another small change to the decoder is in how it handles unparseable
- * streams.  Before, when the decoder found an unparseable stream
- * (reserved for when the decoder encounters a stream from a future
- * encoder that it can't parse), it changed the state to
- * \c FLAC__STREAM_DECODER_UNPARSEABLE_STREAM.  Now the decoder instead
- * drops sync and calls the error callback with a new error code
- * \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM.  This is
- * more robust.  If your error callback does not discriminate on the the
- * error state, your code does not need to be changed.
- *
- * The encoder now has a new setting:
- * FLAC__stream_encoder_set_apodization().  This is for setting the
- * method used to window the data before LPC analysis.  You only need to
- * add a call to this function if the default is not suitable.   There
- * are also two new convenience functions that may be useful:
- * FLAC__metadata_object_cuesheet_calculate_cddb_id() and
- * FLAC__metadata_get_cuesheet().
- *
- * The \a bytes parameter to FLAC__StreamDecoderReadCallback,
- * FLAC__StreamEncoderReadCallback, and FLAC__StreamEncoderWriteCallback
- * is now \c size_t instead of \c unsigned.
- */
-
-/** \defgroup porting_1_1_3_to_1_1_4 Porting from FLAC 1.1.3 to 1.1.4
- *  \ingroup porting
- *
- *  \brief
- *  This module describes porting from FLAC 1.1.3 to FLAC 1.1.4.
- *
- * There were no changes to any of the interfaces from 1.1.3 to 1.1.4.
- * There was a slight change in the implementation of
- * FLAC__stream_encoder_set_metadata(); the function now makes a copy
- * of the \a metadata array of pointers so the client no longer needs
- * to maintain it after the call.  The objects themselves that are
- * pointed to by the array are still not copied though and must be
- * maintained until the call to FLAC__stream_encoder_finish().
- */
-
-/** \defgroup porting_1_1_4_to_1_2_0 Porting from FLAC 1.1.4 to 1.2.0
- *  \ingroup porting
- *
- *  \brief
- *  This module describes porting from FLAC 1.1.4 to FLAC 1.2.0.
- *
- * There were only very minor changes to the interfaces from 1.1.4 to 1.2.0.
- * In libFLAC, \c FLAC__format_sample_rate_is_subset() was added.
- * In libFLAC++, \c FLAC::Decoder::Stream::get_decode_position() was added.
- *
- * Finally, value of the constant \c FLAC__FRAME_HEADER_RESERVED_LEN
- * has changed to reflect the conversion of one of the reserved bits
- * into active use.  It used to be \c 2 and now is \c 1.  However the
- * FLAC frame header length has not changed, so to skip the proper
- * number of bits, use \c FLAC__FRAME_HEADER_RESERVED_LEN +
- * \c FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN
- */
-
-/** \defgroup flac FLAC C API
- *
- * The FLAC C API is the interface to libFLAC, a set of structures
- * describing the components of FLAC streams, and functions for
- * encoding and decoding streams, as well as manipulating FLAC
- * metadata in files.
- *
- * You should start with the format components as all other modules
- * are dependent on it.
- */
-
-#endif
diff --git a/include/share/alloc.h b/include/share/alloc.h
index 5e1f1e2..3b70749 100644
--- a/include/share/alloc.h
+++ b/include/share/alloc.h
@@ -153,11 +153,21 @@
 	return malloc(size1*size2);
 }
 
+static inline void *safe_realloc_(void *ptr, size_t size)
+{
+	void *oldptr = ptr;
+	void *newptr = realloc(ptr, size);
+	if(size > 0 && newptr == 0)
+		free(oldptr);
+	return newptr;
+}
 static inline void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2)
 {
 	size2 += size1;
-	if(size2 < size1)
+	if(size2 < size1) {
+		free(ptr);
 		return 0;
+	}
 	return realloc(ptr, size2);
 }
 
@@ -192,7 +202,7 @@
 		return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */
 	if(size1 > SIZE_MAX / size2)
 		return 0;
-	return realloc(ptr, size1*size2);
+	return safe_realloc_(ptr, size1*size2);
 }
 
 /* size1 * (size2 + size3) */
diff --git a/include/share/compat.h b/include/share/compat.h
index 1ee5cc4..671b110 100644
--- a/include/share/compat.h
+++ b/include/share/compat.h
@@ -87,7 +87,10 @@
 
 #define FLAC__U64L(x) x##ULL
 
-#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
+#if defined _MSC_VER || defined __MINGW32__
+#define FLAC__STRCASECMP _stricmp
+#define FLAC__STRNCASECMP _strnicmp
+#elif defined __BORLANDC__
 #define FLAC__STRCASECMP stricmp
 #define FLAC__STRNCASECMP strnicmp
 #else
diff --git a/libFLAC/Makefile.am b/libFLAC/Makefile.am
deleted file mode 100644
index cbfb0ac..0000000
--- a/libFLAC/Makefile.am
+++ /dev/null
@@ -1,118 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-lib_LTLIBRARIES = libFLAC.la
-if DEBUG
-DEBUGCFLAGS = -DFLAC__OVERFLOW_DETECT
-endif
-if FLaC__CPU_PPC
-# The -force_cpusubtype_ALL is needed to insert a ppc64 instruction
-# into cpu.c with an asm().
-if FLaC__SYS_DARWIN
-#@@@ PPC optimizations temporarily disabled
-CPUCFLAGS = -faltivec -force_cpusubtype_ALL -DFLAC__NO_ASM
-else
-# Linux-gcc for PPC does not have -force_cpusubtype_ALL, it is Darwin-specific
-#@@@ PPC optimizations temporarily disabled
-CPUCFLAGS = -maltivec -mabi=altivec -DFLAC__NO_ASM
-endif
-endif
-
-AM_CFLAGS = $(DEBUGCFLAGS) $(CPUCFLAGS) @OGG_CFLAGS@
-
-if FLaC__NO_ASM
-else
-if FLaC__CPU_IA32
-if FLaC__HAS_NASM
-ARCH_SUBDIRS = ia32
-LOCAL_EXTRA_LIBADD = ia32/libFLAC-asm.la
-endif
-endif
-if FLaC__CPU_PPC
-ARCH_SUBDIRS = ppc
-if FLaC__HAS_AS__TEMPORARILY_DISABLED
-LOCAL_EXTRA_LIBADD = ppc/as/libFLAC-asm.la
-LOCAL_EXTRA_LDFLAGS = "-Wl,-read_only_relocs,warning"
-else
-if FLaC__HAS_GAS__TEMPORARILY_DISABLED
-LOCAL_EXTRA_LIBADD = ppc/gas/libFLAC-asm.la
-LOCAL_EXTRA_LDFLAGS = ""
-endif
-endif
-endif
-endif
-
-libFLAC_la_LIBADD = $(LOCAL_EXTRA_LIBADD) @OGG_LIBS@
-
-SUBDIRS = $(ARCH_SUBDIRS) include .
-
-m4datadir = $(datadir)/aclocal
-m4data_DATA = libFLAC.m4
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = flac.pc
-
-EXTRA_DIST = \
-	Makefile.lite \
-	flac.pc.in \
-	libFLAC_dynamic.dsp \
-	libFLAC_dynamic.vcproj \
-	libFLAC_static.dsp \
-	libFLAC_static.vcproj \
-	libFLAC.m4
-
-if FLaC__HAS_OGG
-extra_ogg_sources = \
-	ogg_decoder_aspect.c \
-	ogg_encoder_aspect.c \
-	ogg_helper.c \
-	ogg_mapping.c
-endif
-# see 'http://www.gnu.org/software/libtool/manual.html#Libtool-versioning' for numbering convention
-libFLAC_la_LDFLAGS = -version-info 10:0:2 -lm $(LOCAL_EXTRA_LDFLAGS)
-libFLAC_la_SOURCES = \
-	bitmath.c \
-	bitreader.c \
-	bitwriter.c \
-	cpu.c \
-	crc.c \
-	fixed.c \
-	float.c \
-	format.c \
-	lpc.c \
-	md5.c \
-	memory.c \
-	metadata_iterators.c \
-	metadata_object.c \
-	stream_decoder.c \
-	stream_encoder.c \
-	stream_encoder_framing.c \
-	window.c \
-	$(extra_ogg_sources)
diff --git a/libFLAC/Makefile.in b/libFLAC/Makefile.in
deleted file mode 100644
index 75bfbbb..0000000
--- a/libFLAC/Makefile.in
+++ /dev/null
@@ -1,872 +0,0 @@
-# Makefile.in generated by automake 1.7.9 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEBUG_FALSE = @DEBUG_FALSE@
-DEBUG_TRUE = @DEBUG_TRUE@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
-DOXYGEN = @DOXYGEN@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@
-FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@
-FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@
-FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@
-FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@
-FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@
-FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@
-FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@
-FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@
-FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@
-FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@
-FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@
-FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@
-FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@
-FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@
-FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@
-FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@
-FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@
-FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@
-FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@
-FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@
-FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@
-FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@
-FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@
-FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@
-FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@
-FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@
-FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@
-FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@
-FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@
-FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@
-FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@
-FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@
-FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@
-GAS = @GAS@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBICONV = @LTLIBICONV@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@
-NASM = @NASM@
-OBJEXT = @OBJEXT@
-OBJ_FORMAT = @OBJ_FORMAT@
-OGG_CFLAGS = @OGG_CFLAGS@
-OGG_LIBS = @OGG_LIBS@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XMMS_CFLAGS = @XMMS_CFLAGS@
-XMMS_CONFIG = @XMMS_CONFIG@
-XMMS_DATA_DIR = @XMMS_DATA_DIR@
-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@
-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@
-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@
-XMMS_LIBS = @XMMS_LIBS@
-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@
-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@
-XMMS_VERSION = @XMMS_VERSION@
-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-
-lib_LTLIBRARIES = libFLAC.la
-@DEBUG_TRUE@DEBUGCFLAGS = -DFLAC__OVERFLOW_DETECT
-# The -force_cpusubtype_ALL is needed to insert a ppc64 instruction
-# into cpu.c with an asm().
-#@@@ PPC optimizations temporarily disabled
-@FLaC__CPU_PPC_TRUE@@FLaC__SYS_DARWIN_TRUE@CPUCFLAGS = -faltivec -force_cpusubtype_ALL -DFLAC__NO_ASM
-# Linux-gcc for PPC does not have -force_cpusubtype_ALL, it is Darwin-specific
-#@@@ PPC optimizations temporarily disabled
-@FLaC__CPU_PPC_TRUE@@FLaC__SYS_DARWIN_FALSE@CPUCFLAGS = -maltivec -mabi=altivec -DFLAC__NO_ASM
-
-AM_CFLAGS = $(DEBUGCFLAGS) $(CPUCFLAGS) @OGG_CFLAGS@
-@FLaC__CPU_PPC_TRUE@@FLaC__NO_ASM_FALSE@ARCH_SUBDIRS = ppc
-
-@FLaC__CPU_IA32_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@ARCH_SUBDIRS = ia32
-@FLaC__CPU_IA32_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@LOCAL_EXTRA_LIBADD = ia32/libFLAC-asm.la
-@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__NO_ASM_FALSE@LOCAL_EXTRA_LIBADD = ppc/as/libFLAC-asm.la
-@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__NO_ASM_FALSE@LOCAL_EXTRA_LIBADD = ppc/gas/libFLAC-asm.la
-@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__NO_ASM_FALSE@LOCAL_EXTRA_LDFLAGS = "-Wl,-read_only_relocs,warning"
-@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__NO_ASM_FALSE@LOCAL_EXTRA_LDFLAGS = ""
-
-libFLAC_la_LIBADD = $(LOCAL_EXTRA_LIBADD) @OGG_LIBS@
-
-SUBDIRS = $(ARCH_SUBDIRS) include .
-
-m4datadir = $(datadir)/aclocal
-m4data_DATA = libFLAC.m4
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = flac.pc
-
-EXTRA_DIST = \
-	Makefile.lite \
-	flac.pc.in \
-	libFLAC_dynamic.dsp \
-	libFLAC_dynamic.vcproj \
-	libFLAC_static.dsp \
-	libFLAC_static.vcproj \
-	libFLAC.m4
-
-
-@FLaC__HAS_OGG_TRUE@extra_ogg_sources = \
-@FLaC__HAS_OGG_TRUE@	ogg_decoder_aspect.c \
-@FLaC__HAS_OGG_TRUE@	ogg_encoder_aspect.c \
-@FLaC__HAS_OGG_TRUE@	ogg_helper.c \
-@FLaC__HAS_OGG_TRUE@	ogg_mapping.c
-
-# see 'http://www.gnu.org/software/libtool/manual.html#Libtool-versioning' for numbering convention
-libFLAC_la_LDFLAGS = -version-info 10:0:2 -lm $(LOCAL_EXTRA_LDFLAGS)
-libFLAC_la_SOURCES = \
-	bitmath.c \
-	bitreader.c \
-	bitwriter.c \
-	cpu.c \
-	crc.c \
-	fixed.c \
-	float.c \
-	format.c \
-	lpc.c \
-	md5.c \
-	memory.c \
-	metadata_iterators.c \
-	metadata_object.c \
-	stream_decoder.c \
-	stream_encoder.c \
-	stream_encoder_framing.c \
-	window.c \
-	$(extra_ogg_sources)
-
-subdir = src/libFLAC
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = flac.pc
-LTLIBRARIES = $(lib_LTLIBRARIES)
-
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@	ppc/gas/libFLAC-asm.la
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ppc/gas/libFLAC-asm.la
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@	ppc/as/libFLAC-asm.la
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ppc/as/libFLAC-asm.la
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@	ppc/as/libFLAC-asm.la
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_FALSE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ppc/as/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ia32/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ia32/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ia32/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_FALSE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ia32/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ia32/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@	ppc/gas/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ia32/libFLAC-asm.la \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ppc/gas/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@	ppc/as/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ia32/libFLAC-asm.la \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ppc/as/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_FALSE@@FLaC__NO_ASM_FALSE@	ppc/as/libFLAC-asm.la
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_TRUE@libFLAC_la_DEPENDENCIES =
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@libFLAC_la_DEPENDENCIES = \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ia32/libFLAC-asm.la \
-@FLaC__CPU_IA32_TRUE@@FLaC__CPU_PPC_TRUE@@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@@FLaC__HAS_NASM_TRUE@@FLaC__NO_ASM_FALSE@	ppc/as/libFLAC-asm.la
-am__libFLAC_la_SOURCES_DIST = bitmath.c bitreader.c bitwriter.c cpu.c \
-	crc.c fixed.c float.c format.c lpc.c md5.c memory.c \
-	metadata_iterators.c metadata_object.c stream_decoder.c \
-	stream_encoder.c stream_encoder_framing.c window.c \
-	ogg_decoder_aspect.c ogg_encoder_aspect.c ogg_helper.c \
-	ogg_mapping.c
-@FLaC__HAS_OGG_TRUE@am__objects_1 = ogg_decoder_aspect.lo \
-@FLaC__HAS_OGG_TRUE@	ogg_encoder_aspect.lo ogg_helper.lo \
-@FLaC__HAS_OGG_TRUE@	ogg_mapping.lo
-am_libFLAC_la_OBJECTS = bitmath.lo bitreader.lo bitwriter.lo cpu.lo \
-	crc.lo fixed.lo float.lo format.lo lpc.lo md5.lo memory.lo \
-	metadata_iterators.lo metadata_object.lo stream_decoder.lo \
-	stream_encoder.lo stream_encoder_framing.lo window.lo \
-	$(am__objects_1)
-libFLAC_la_OBJECTS = $(am_libFLAC_la_OBJECTS)
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/bitmath.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/bitreader.Plo ./$(DEPDIR)/bitwriter.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/cpu.Plo ./$(DEPDIR)/crc.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/fixed.Plo ./$(DEPDIR)/float.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/format.Plo ./$(DEPDIR)/lpc.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/md5.Plo ./$(DEPDIR)/memory.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/metadata_iterators.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/metadata_object.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/ogg_decoder_aspect.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/ogg_encoder_aspect.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/ogg_helper.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/ogg_mapping.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/stream_decoder.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/stream_encoder.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/stream_encoder_framing.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/window.Plo
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
-	$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(am__libFLAC_la_SOURCES_DIST)
-DATA = $(m4data_DATA) $(pkgconfig_DATA)
-
-
-RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
-	ps-recursive install-info-recursive uninstall-info-recursive \
-	all-recursive install-data-recursive install-exec-recursive \
-	installdirs-recursive install-recursive uninstall-recursive \
-	check-recursive installcheck-recursive
-DIST_COMMON = $(srcdir)/Makefile.in Makefile.am flac.pc.in
-DIST_SUBDIRS = ppc ia32 include .
-SOURCES = $(libFLAC_la_SOURCES)
-
-all: all-recursive
-
-.SUFFIXES:
-.SUFFIXES: .c .lo .o .obj
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/libFLAC/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-flac.pc: $(top_builddir)/config.status flac.pc.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-libLTLIBRARIES_INSTALL = $(INSTALL)
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(libdir)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  if test -f $$p; then \
-	    f="`echo $$p | sed -e 's|^.*/||'`"; \
-	    echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f"; \
-	    $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f; \
-	  else :; fi; \
-	done
-
-uninstall-libLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	    p="`echo $$p | sed -e 's|^.*/||'`"; \
-	  echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p"; \
-	  $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
-	done
-
-clean-libLTLIBRARIES:
-	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
-	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" = "$$p" && dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libFLAC.la: $(libFLAC_la_OBJECTS) $(libFLAC_la_DEPENDENCIES) 
-	$(LINK) -rpath $(libdir) $(libFLAC_la_LDFLAGS) $(libFLAC_la_OBJECTS) $(libFLAC_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitmath.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitreader.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitwriter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fixed.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/float.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/format.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lpc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/memory.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metadata_iterators.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metadata_object.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_decoder_aspect.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_encoder_aspect.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_helper.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ogg_mapping.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_decoder.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_encoder.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_encoder_framing.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/window.Plo@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@	if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-
-.c.lo:
-@am__fastdepCC_TRUE@	if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@	  -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; \
-@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@	fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-m4dataDATA_INSTALL = $(INSTALL_DATA)
-install-m4dataDATA: $(m4data_DATA)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(m4datadir)
-	@list='$(m4data_DATA)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f="`echo $$p | sed -e 's|^.*/||'`"; \
-	  echo " $(m4dataDATA_INSTALL) $$d$$p $(DESTDIR)$(m4datadir)/$$f"; \
-	  $(m4dataDATA_INSTALL) $$d$$p $(DESTDIR)$(m4datadir)/$$f; \
-	done
-
-uninstall-m4dataDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(m4data_DATA)'; for p in $$list; do \
-	  f="`echo $$p | sed -e 's|^.*/||'`"; \
-	  echo " rm -f $(DESTDIR)$(m4datadir)/$$f"; \
-	  rm -f $(DESTDIR)$(m4datadir)/$$f; \
-	done
-pkgconfigDATA_INSTALL = $(INSTALL_DATA)
-install-pkgconfigDATA: $(pkgconfig_DATA)
-	@$(NORMAL_INSTALL)
-	$(mkinstalldirs) $(DESTDIR)$(pkgconfigdir)
-	@list='$(pkgconfig_DATA)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f="`echo $$p | sed -e 's|^.*/||'`"; \
-	  echo " $(pkgconfigDATA_INSTALL) $$d$$p $(DESTDIR)$(pkgconfigdir)/$$f"; \
-	  $(pkgconfigDATA_INSTALL) $$d$$p $(DESTDIR)$(pkgconfigdir)/$$f; \
-	done
-
-uninstall-pkgconfigDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(pkgconfig_DATA)'; for p in $$list; do \
-	  f="`echo $$p | sed -e 's|^.*/||'`"; \
-	  echo " rm -f $(DESTDIR)$(pkgconfigdir)/$$f"; \
-	  rm -f $(DESTDIR)$(pkgconfigdir)/$$f; \
-	done
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@set fnord $$MAKEFLAGS; amf=$$2; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
-	@set fnord $$MAKEFLAGS; amf=$$2; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if (etags --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	else \
-	  include_option=--include; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -f $$subdir/TAGS && \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ../..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d $(distdir)/$$subdir \
-	    || mkdir $(distdir)/$$subdir \
-	    || exit 1; \
-	    (cd $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$(top_distdir)" \
-	        distdir=../$(distdir)/$$subdir \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(LTLIBRARIES) $(DATA)
-installdirs: installdirs-recursive
-installdirs-am:
-	$(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(m4datadir) $(DESTDIR)$(pkgconfigdir)
-
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
-	mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-m4dataDATA install-pkgconfigDATA
-
-install-exec-am: install-libLTLIBRARIES
-
-install-info: install-info-recursive
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -rf ./$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \
-	uninstall-m4dataDATA uninstall-pkgconfigDATA
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
-	clean-generic clean-libLTLIBRARIES clean-libtool \
-	clean-recursive ctags ctags-recursive distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-recursive distclean-tags distdir dvi dvi-am \
-	dvi-recursive info info-am info-recursive install install-am \
-	install-data install-data-am install-data-recursive \
-	install-exec install-exec-am install-exec-recursive \
-	install-info install-info-am install-info-recursive \
-	install-libLTLIBRARIES install-m4dataDATA install-man \
-	install-pkgconfigDATA install-recursive install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	installdirs-recursive maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
-	pdf pdf-am pdf-recursive ps ps-am ps-recursive tags \
-	tags-recursive uninstall uninstall-am uninstall-info-am \
-	uninstall-info-recursive uninstall-libLTLIBRARIES \
-	uninstall-m4dataDATA uninstall-pkgconfigDATA \
-	uninstall-recursive
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libFLAC/Makefile.lite b/libFLAC/Makefile.lite
deleted file mode 100644
index 8ea37f8..0000000
--- a/libFLAC/Makefile.lite
+++ /dev/null
@@ -1,90 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-#
-# GNU makefile
-#
-
-topdir = ../..
-
-LIB_NAME = libFLAC
-ifeq ($(DARWIN_BUILD),yes)
-DEFINES = -DFLAC__CPU_PPC -DFLAC__USE_ALTIVEC -DFLAC__ALIGN_MALLOC_DATA
-else
-ifeq ($(SOLARIS_BUILD),yes)
-DEFINES = -DFLAC__NO_ASM -DFLAC__ALIGN_MALLOC_DATA
-else
-DEFINES = -DFLAC__CPU_IA32 -DFLAC__USE_3DNOW -DFLAC__HAS_NASM -DFLAC__ALIGN_MALLOC_DATA
-endif
-endif
-INCLUDES = -I./include -I$(topdir)/include -I$(OGG_INCLUDE_DIR)
-DEBUG_CFLAGS = -DFLAC__OVERFLOW_DETECT
-
-ifeq ($(DARWIN_BUILD),yes)
-SRCS_S = \
-	ppc/as/lpc_asm.s
-else
-ifeq ($(SOLARIS_BUILD),yes)
-else
-SRCS_NASM = \
-	ia32/bitreader_asm.nasm \
-	ia32/cpu_asm.nasm \
-	ia32/fixed_asm.nasm \
-	ia32/lpc_asm.nasm \
-	ia32/stream_encoder_asm.nasm
-endif
-endif
-
-SRCS_C = \
-	bitmath.c \
-	bitreader.c \
-	bitwriter.c \
-	cpu.c \
-	crc.c \
-	fixed.c \
-	float.c \
-	format.c \
-	lpc.c \
-	md5.c \
-	memory.c \
-	metadata_iterators.c \
-	metadata_object.c \
-	ogg_decoder_aspect.c \
-	ogg_encoder_aspect.c \
-	ogg_helper.c \
-	ogg_mapping.c \
-	stream_decoder.c \
-	stream_encoder.c \
-	stream_encoder_framing.c \
-	window.c
-
-include $(topdir)/build/lib.mk
-
-# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/libFLAC/NOTICE b/libFLAC/NOTICE
deleted file mode 100644
index 0a104a9..0000000
--- a/libFLAC/NOTICE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-
-Redistribution and use 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 the Xiph.org Foundation nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-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 FOUNDATION 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.
diff --git a/libFLAC/bitreader.c b/libFLAC/bitreader.c
index f61229b..67d0f37 100644
--- a/libFLAC/bitreader.c
+++ b/libFLAC/bitreader.c
@@ -418,12 +418,14 @@
 
 FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits)
 {
+	FLAC__uint32 uval, mask;
 	/* OPT: inline raw uint32 code here, or make into a macro if possible in the .h file */
-	if(!FLAC__bitreader_read_raw_uint32(br, (FLAC__uint32*)val, bits))
+	if(!FLAC__bitreader_read_raw_uint32(br, &uval, bits))
 		return false;
-	/* sign-extend: */
-	*val <<= (32-bits);
-	*val >>= (32-bits);
+	/* sign-extend *val assuming it is currently bits wide. */
+	/* From: https://graphics.stanford.edu/~seander/bithacks.html#FixedSignExtend */
+	mask = 1u << (bits - 1);
+	*val = (uval ^ mask) - mask;
 	return true;
 }
 
diff --git a/libFLAC/bitwriter.c b/libFLAC/bitwriter.c
index 76be1bc..dcdd93e 100644
--- a/libFLAC/bitwriter.c
+++ b/libFLAC/bitwriter.c
@@ -520,7 +520,9 @@
 
 	while(nvals) {
 		/* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */
-		uval = (*vals<<1) ^ (*vals>>31);
+		uval = *vals;
+		uval <<= 1;
+		uval ^= (*vals>>31);
 
 		msbits = uval >> parameter;
 
diff --git a/libFLAC/cpu.c b/libFLAC/cpu.c
index 40c7950..8249500 100644
--- a/libFLAC/cpu.c
+++ b/libFLAC/cpu.c
@@ -240,6 +240,8 @@
 # else
 		disable_sse(info);
 # endif
+#elif defined(__ANDROID__) || defined(ANDROID)
+		/* no need to check OS SSE support */
 #elif defined(__linux__)
 		int sse = 0;
 		struct sigaction sigill_save;
diff --git a/libFLAC/flac.pc.in b/libFLAC/flac.pc.in
deleted file mode 100644
index 8fc39f8..0000000
--- a/libFLAC/flac.pc.in
+++ /dev/null
@@ -1,10 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: FLAC
-Description: Free Lossless Audio Codec Library
-Version: @VERSION@
-Libs: -L${libdir} -lFLAC -lm
-Cflags: -I${includedir}/FLAC
diff --git a/libFLAC/format.c b/libFLAC/format.c
index 4d0d832..0b1d10b 100644
--- a/libFLAC/format.c
+++ b/libFLAC/format.c
@@ -39,6 +39,7 @@
 #include <string.h> /* for memset() */
 #include "FLAC/assert.h"
 #include "FLAC/format.h"
+#include "share/alloc.h"
 #include "share/compat.h"
 #include "private/format.h"
 #include "private/macros.h"
@@ -274,6 +275,9 @@
 
 	FLAC__ASSERT(0 != seek_table);
 
+	if (seek_table->num_points == 0)
+		return 0;
+
 	/* sort the seekpoints */
 	qsort(seek_table->points, seek_table->num_points, sizeof(FLAC__StreamMetadata_SeekPoint), (int (*)(const void *, const void *))seekpoint_compare_);
 
@@ -573,9 +577,9 @@
 	FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters && 0 == object->raw_bits));
 
 	if(object->capacity_by_order < max_partition_order) {
-		if(0 == (object->parameters = realloc(object->parameters, sizeof(unsigned)*(1 << max_partition_order))))
+		if(0 == (object->parameters = safe_realloc_(object->parameters, sizeof(unsigned)*(1 << max_partition_order))))
 			return false;
-		if(0 == (object->raw_bits = realloc(object->raw_bits, sizeof(unsigned)*(1 << max_partition_order))))
+		if(0 == (object->raw_bits = safe_realloc_(object->raw_bits, sizeof(unsigned)*(1 << max_partition_order))))
 			return false;
 		memset(object->raw_bits, 0, sizeof(unsigned)*(1 << max_partition_order));
 		object->capacity_by_order = max_partition_order;
diff --git a/libFLAC/ia32/Makefile.am b/libFLAC/ia32/Makefile.am
deleted file mode 100644
index 04a5b98..0000000
--- a/libFLAC/ia32/Makefile.am
+++ /dev/null
@@ -1,45 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-SUFFIXES = .nasm .lo
-
-STRIP_NON_ASM = sh $(top_srcdir)/strip_non_asm_libtool_args.sh
-
-.nasm.lo:
-	$(LIBTOOL) --tag=CC --mode=compile $(STRIP_NON_ASM) $(NASM) -f $(OBJ_FORMAT) -d OBJ_FORMAT_$(OBJ_FORMAT) -i$(srcdir)/ $< -o $@
-
-noinst_LTLIBRARIES = libFLAC-asm.la
-libFLAC_asm_la_SOURCES = \
-	bitreader_asm.nasm \
-	cpu_asm.nasm \
-	fixed_asm.nasm \
-	lpc_asm.nasm \
-	nasm.h \
-	stream_encoder_asm.nasm
diff --git a/libFLAC/ia32/Makefile.in b/libFLAC/ia32/Makefile.in
deleted file mode 100644
index 3a14b13..0000000
--- a/libFLAC/ia32/Makefile.in
+++ /dev/null
@@ -1,487 +0,0 @@
-# Makefile.in generated by automake 1.7.9 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEBUG_FALSE = @DEBUG_FALSE@
-DEBUG_TRUE = @DEBUG_TRUE@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
-DOXYGEN = @DOXYGEN@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@
-FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@
-FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@
-FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@
-FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@
-FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@
-FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@
-FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@
-FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@
-FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@
-FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@
-FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@
-FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@
-FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@
-FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@
-FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@
-FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@
-FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@
-FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@
-FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@
-FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@
-FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@
-FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@
-FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@
-FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@
-FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@
-FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@
-FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@
-FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@
-FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@
-FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@
-FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@
-FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@
-FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@
-GAS = @GAS@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBICONV = @LTLIBICONV@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@
-NASM = @NASM@
-OBJEXT = @OBJEXT@
-OBJ_FORMAT = @OBJ_FORMAT@
-OGG_CFLAGS = @OGG_CFLAGS@
-OGG_LIBS = @OGG_LIBS@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XMMS_CFLAGS = @XMMS_CFLAGS@
-XMMS_CONFIG = @XMMS_CONFIG@
-XMMS_DATA_DIR = @XMMS_DATA_DIR@
-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@
-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@
-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@
-XMMS_LIBS = @XMMS_LIBS@
-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@
-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@
-XMMS_VERSION = @XMMS_VERSION@
-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-
-SUFFIXES = .nasm .lo
-
-STRIP_NON_ASM = sh $(top_srcdir)/strip_non_asm_libtool_args.sh
-
-noinst_LTLIBRARIES = libFLAC-asm.la
-libFLAC_asm_la_SOURCES = \
-	bitreader_asm.nasm \
-	cpu_asm.nasm \
-	fixed_asm.nasm \
-	lpc_asm.nasm \
-	nasm.h \
-	stream_encoder_asm.nasm
-
-subdir = src/libFLAC/ia32
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-
-libFLAC_asm_la_LDFLAGS =
-libFLAC_asm_la_LIBADD =
-am_libFLAC_asm_la_OBJECTS = bitreader_asm.lo cpu_asm.lo fixed_asm.lo \
-	lpc_asm.lo stream_encoder_asm.lo
-libFLAC_asm_la_OBJECTS = $(am_libFLAC_asm_la_OBJECTS)
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
-	$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(libFLAC_asm_la_SOURCES)
-DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
-SOURCES = $(libFLAC_asm_la_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .nasm .lo
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/libFLAC/ia32/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-clean-noinstLTLIBRARIES:
-	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" = "$$p" && dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libFLAC-asm.la: $(libFLAC_asm_la_OBJECTS) $(libFLAC_asm_la_DEPENDENCIES) 
-	$(LINK)  $(libFLAC_asm_la_LDFLAGS) $(libFLAC_asm_la_OBJECTS) $(libFLAC_asm_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ../../..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES)
-
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstLTLIBRARIES ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am info info-am install \
-	install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool pdf \
-	pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am
-
-
-.nasm.lo:
-	$(LIBTOOL) --tag=CC --mode=compile $(STRIP_NON_ASM) $(NASM) -f $(OBJ_FORMAT) -d OBJ_FORMAT_$(OBJ_FORMAT) -i$(srcdir)/ $< -o $@
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libFLAC/ia32/bitreader_asm.nasm b/libFLAC/ia32/bitreader_asm.nasm
deleted file mode 100644
index 5d1bbfa..0000000
--- a/libFLAC/ia32/bitreader_asm.nasm
+++ /dev/null
@@ -1,568 +0,0 @@
-;  vim:filetype=nasm ts=8
-
-;  libFLAC - Free Lossless Audio Codec library
-;  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-;
-;  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-;  contributors may be used to endorse or promote products derived from
-;  this software without specific prior written permission.
-;
-;  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 FOUNDATION 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.
-
-%include "nasm.h"
-
-	data_section
-
-cextern FLAC__crc16_table		; unsigned FLAC__crc16_table[256];
-cextern bitreader_read_from_client_	; FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br);
-
-cglobal FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap
-
-	code_section
-
-
-; **********************************************************************
-;
-; void FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter)
-;
-; Some details like assertions and other checking is performed by the caller.
-	ALIGN 16
-cident FLAC__bitreader_read_rice_signed_block_asm_ia32_bswap
-
-	;ASSERT(0 != br);
-	;ASSERT(0 != br->buffer);
-	; WATCHOUT: code only works if sizeof(brword)==32; we can make things much faster with this assertion
-	;ASSERT(FLAC__BITS_PER_WORD == 32);
-	;ASSERT(parameter < 32);
-	; the above two asserts also guarantee that the binary part never straddles more than 2 words, so we don't have to loop to read it
-
-	;; peppered throughout the code at major checkpoints are keys like this as to where things are at that point in time
-	;; [esp + 16]	unsigned parameter
-	;; [esp + 12]	unsigned nvals
-	;; [esp + 8]	int vals[]
-	;; [esp + 4]	FLAC__BitReader *br
-	mov	eax, [esp + 12]		; if(nvals == 0)
-	test	eax, eax
-	ja	.nvals_gt_0
-	mov	eax, 1			;   return true;
-	ret
-
-.nvals_gt_0:
-	push	ebp
-	push	ebx
-	push	esi
-	push	edi
-	sub	esp, 4
-	;; [esp + 36]	unsigned parameter
-	;; [esp + 32]	unsigned nvals
-	;; [esp + 28]	int vals[]
-	;; [esp + 24]	FLAC__BitReader *br
-	;; [esp]	ucbits
-	mov	ebp, [esp + 24]		; ebp <- br == br->buffer
-	mov	esi, [ebp + 16]		; esi <- br->consumed_words (aka 'cwords' in the C version)
-	mov	ecx, [ebp + 20]		; ecx <- br->consumed_bits  (aka 'cbits'  in the C version)
-	xor	edi, edi		; edi <- 0  'uval'
-	;; ecx		cbits
-	;; esi		cwords
-	;; edi		uval
-	;; ebp		br
-	;; [ebp]	br->buffer
-	;; [ebp + 8]	br->words
-	;; [ebp + 12]	br->bytes
-	;; [ebp + 16]	br->consumed_words
-	;; [ebp + 20]	br->consumed_bits
-	;; [ebp + 24]	br->read_crc
-	;; [ebp + 28]	br->crc16_align
-
-					; ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits;
-	mov	eax, [ebp + 8]		;   eax <- br->words
-	sub	eax, esi		;   eax <- br->words-cwords
-	shl	eax, 2			;   eax <- (br->words-cwords)*FLAC__BYTES_PER_WORD
-	add	eax, [ebp + 12]		;   eax <- (br->words-cwords)*FLAC__BYTES_PER_WORD + br->bytes
-	shl	eax, 3			;   eax <- (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8
-	sub	eax, ecx		;   eax <- (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits
-	mov	[esp], eax		;   ucbits <- eax
-
-	ALIGN 16
-.val_loop:				; while(1) {
-
-	;
-	; read unary part
-	;
-.unary_loop:				;   while(1) {
-	;; ecx		cbits
-	;; esi		cwords
-	;; edi		uval
-	;; ebp		br
-	cmp	esi, [ebp + 8]		;     while(cwords < br->words)   /* if we've not consumed up to a partial tail word... */
-	jae	near .c1_next1
-.c1_loop:				;     {
-	mov	ebx, [ebp]
-	mov	eax, [ebx + 4*esi]	;       b = br->buffer[cwords]
-	mov	edx, eax		;       edx = br->buffer[cwords] (saved for later use)
-	shl	eax, cl 		;       b = br->buffer[cwords] << cbits
-	test	eax, eax		;         (still have to test since cbits may be 0, thus ZF not updated for shl eax,0)
-	jz	near .c1_next2		;       if(b) {
-	bsr	ebx, eax
-	not	ebx
-	and	ebx, 31			;         ebx = 'i' = # of leading 0 bits in 'b' (eax)
-	add	ecx, ebx		;         cbits += i;
-	add	edi, ebx		;         uval += i;
-	add	ecx, byte 1		;         cbits++; /* skip over stop bit */
-	test	ecx, ~31
-	jz	near .break1 		;         if(cbits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(cbits == FLAC__BITS_PER_WORD) */
-					;           crc16_update_word_(br, br->buffer[cwords]);
-	push	edi			;		[need more registers]
-	bswap	edx			;		edx = br->buffer[cwords] swapped; now we can CRC the bytes from LSByte to MSByte which makes things much easier
-	mov	ecx, [ebp + 28]		;		ecx <- br->crc16_align
-	mov	eax, [ebp + 24]		;		ax <- br->read_crc (a.k.a. crc)
-%ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
-	mov	edi, _FLAC__crc16_table
-%else
-	mov	edi, FLAC__crc16_table
-%endif
-	;; eax (ax)	crc a.k.a. br->read_crc
-	;; ebx (bl)	intermediate result index into FLAC__crc16_table[]
-	;; ecx		br->crc16_align
-	;; edx		byteswapped brword to CRC
-	;; esi		cwords
-	;; edi		unsigned FLAC__crc16_table[]
-	;; ebp		br
-	test	ecx, ecx		;		switch(br->crc16_align) ...
-	jnz	.c0b4			;		[br->crc16_align is 0 the vast majority of the time so we optimize the common case]
-.c0b0:	xor	dl, ah			;		dl <- (crc>>8)^(word>>24)
-	movzx	ebx, dl
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^(word>>24)]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^(word>>24)]
-.c0b1:	xor	dh, ah			;		dh <- (crc>>8)^((word>>16)&0xff))
-	movzx	ebx, dh
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^((word>>16)&0xff))]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^((word>>16)&0xff))]
-	shr	edx, 16
-.c0b2:	xor	dl, ah			;		dl <- (crc>>8)^((word>>8)&0xff))
-	movzx	ebx, dl
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^((word>>8)&0xff))]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^((word>>8)&0xff))]
-.c0b3:	xor	dh, ah			;		dh <- (crc>>8)^(word&0xff)
-	movzx	ebx, dh
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^(word&0xff)]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^(word&0xff)]
-	movzx	eax, ax
-	mov	[ebp + 24], eax		;		br->read_crc <- crc
-	pop	edi
-
-	add	esi, byte 1		;           cwords++;
-	xor	ecx, ecx		;           cbits = 0;
-					;         }
-	jmp	near .break1		;         goto break1;
-	;; this section relocated out of the way for performance
-.c0b4:
-	mov	[ebp + 28], dword 0	;		br->crc16_align <- 0
-	cmp	ecx, 8
-	je	.c0b1
-	shr	edx, 16
-	cmp	ecx, 16
-	je	.c0b2
-	jmp	.c0b3
-
-	;; this section relocated out of the way for performance
-.c1b4:
-	mov	[ebp + 28], dword 0	;		br->crc16_align <- 0
-	cmp	ecx, 8
-	je	.c1b1
-	shr	edx, 16
-	cmp	ecx, 16
-	je	.c1b2
-	jmp	.c1b3
-
-.c1_next2:				;       } else {
-	;; ecx		cbits
-	;; edx		current brword 'b'
-	;; esi		cwords
-	;; edi		uval
-	;; ebp		br
-	add	edi, 32
-	sub	edi, ecx		;         uval += FLAC__BITS_PER_WORD - cbits;
-					;         crc16_update_word_(br, br->buffer[cwords]);
-	push	edi			;		[need more registers]
-	bswap	edx			;		edx = br->buffer[cwords] swapped; now we can CRC the bytes from LSByte to MSByte which makes things much easier
-	mov	ecx, [ebp + 28]		;		ecx <- br->crc16_align
-	mov	eax, [ebp + 24]		;		ax <- br->read_crc (a.k.a. crc)
-%ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
-	mov	edi, _FLAC__crc16_table
-%else
-	mov	edi, FLAC__crc16_table
-%endif
-	;; eax (ax)	crc a.k.a. br->read_crc
-	;; ebx (bl)	intermediate result index into FLAC__crc16_table[]
-	;; ecx		br->crc16_align
-	;; edx		byteswapped brword to CRC
-	;; esi		cwords
-	;; edi		unsigned FLAC__crc16_table[]
-	;; ebp		br
-	test	ecx, ecx		;		switch(br->crc16_align) ...
-	jnz	.c1b4			;		[br->crc16_align is 0 the vast majority of the time so we optimize the common case]
-.c1b0:	xor	dl, ah			;		dl <- (crc>>8)^(word>>24)
-	movzx	ebx, dl
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^(word>>24)]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^(word>>24)]
-.c1b1:	xor	dh, ah			;		dh <- (crc>>8)^((word>>16)&0xff))
-	movzx	ebx, dh
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^((word>>16)&0xff))]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^((word>>16)&0xff))]
-	shr	edx, 16
-.c1b2:	xor	dl, ah			;		dl <- (crc>>8)^((word>>8)&0xff))
-	movzx	ebx, dl
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^((word>>8)&0xff))]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^((word>>8)&0xff))]
-.c1b3:	xor	dh, ah			;		dh <- (crc>>8)^(word&0xff)
-	movzx	ebx, dh
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^(word&0xff)]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^(word&0xff)]
-	movzx	eax, ax
-	mov	[ebp + 24], eax		;		br->read_crc <- crc
-	pop	edi
-
-	add	esi, byte 1		;         cwords++;
-	xor	ecx, ecx		;         cbits = 0;
-					;         /* didn't find stop bit yet, have to keep going... */
-					;       }
-
-	cmp	esi, [ebp + 8]		;     } while(cwords < br->words)   /* if we've not consumed up to a partial tail word... */
-	jb	near .c1_loop
-
-.c1_next1:
-	; at this point we've eaten up all the whole words; have to try
-	; reading through any tail bytes before calling the read callback.
-	; this is a repeat of the above logic adjusted for the fact we
-	; don't have a whole word.  note though if the client is feeding
-	; us data a byte at a time (unlikely), br->consumed_bits may not
-	; be zero.
-	;; ecx		cbits
-	;; esi		cwords
-	;; edi		uval
-	;; ebp		br
-	mov	edx, [ebp + 12]		;     edx <- br->bytes
-	test	edx, edx
-	jz	.read1			;     if(br->bytes) {  [NOTE: this case is rare so it doesn't have to be all that fast ]
-	mov	ebx, [ebp]
-	shl	edx, 3			;       edx <- const unsigned end = br->bytes * 8;
-	mov	eax, [ebx + 4*esi]	;       b = br->buffer[cwords]
-	xchg	edx, ecx		;       [edx <- cbits , ecx <- end]
-	mov	ebx, 0xffffffff		;       ebx <- FLAC__WORD_ALL_ONES
-	shr	ebx, cl			;       ebx <- FLAC__WORD_ALL_ONES >> end
-	not	ebx			;       ebx <- ~(FLAC__WORD_ALL_ONES >> end)
-	xchg	edx, ecx		;       [edx <- end , ecx <- cbits]
-	and	eax, ebx		;       b = (br->buffer[cwords] & ~(FLAC__WORD_ALL_ONES >> end));
-	shl	eax, cl 		;       b = (br->buffer[cwords] & ~(FLAC__WORD_ALL_ONES >> end)) << cbits;
-	test	eax, eax		;         (still have to test since cbits may be 0, thus ZF not updated for shl eax,0)
-	jz	.c1_next3		;       if(b) {
-	bsr	ebx, eax
-	not	ebx
-	and	ebx, 31			;         ebx = 'i' = # of leading 0 bits in 'b' (eax)
-	add	ecx, ebx		;         cbits += i;
-	add	edi, ebx		;         uval += i;
-	add	ecx, byte 1		;         cbits++; /* skip over stop bit */
-	jmp	short .break1 		;         goto break1;
-.c1_next3:				;       } else {
-	sub	edi, ecx
-	add	edi, edx		;         uval += end - cbits;
-	add	ecx, edx		;         cbits += end
-					;         /* didn't find stop bit yet, have to keep going... */
-					;       }
-					;     }
-.read1:
-	; flush registers and read; bitreader_read_from_client_() does
-	; not touch br->consumed_bits at all but we still need to set
-	; it in case it fails and we have to return false.
-	;; ecx		cbits
-	;; esi		cwords
-	;; edi		uval
-	;; ebp		br
-	mov	[ebp + 16], esi		;     br->consumed_words = cwords;
-	mov	[ebp + 20], ecx		;     br->consumed_bits = cbits;
-	push	ecx			;     /* save */
-	push	ebp			;     /* push br argument */
-%ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
-	call	_bitreader_read_from_client_
-%else
-	call	bitreader_read_from_client_
-%endif
-	pop	edx			;     /* discard, unused */
-	pop	ecx			;     /* restore */
-	mov	esi, [ebp + 16]		;     cwords = br->consumed_words;
-					;     ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits;
-	mov	ebx, [ebp + 8]		;       ebx <- br->words
-	sub	ebx, esi		;       ebx <- br->words-cwords
-	shl	ebx, 2			;       ebx <- (br->words-cwords)*FLAC__BYTES_PER_WORD
-	add	ebx, [ebp + 12]		;       ebx <- (br->words-cwords)*FLAC__BYTES_PER_WORD + br->bytes
-	shl	ebx, 3			;       ebx <- (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8
-	sub	ebx, ecx		;       ebx <- (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits
-	add	ebx, edi		;       ebx <- (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits + uval
-					;           + uval to offset our count by the # of unary bits already
-					;           consumed before the read, because we will add these back
-					;           in all at once at break1
-	mov	[esp], ebx		;       ucbits <- ebx
-	test	eax, eax		;     if(!bitreader_read_from_client_(br))
-	jnz	near .unary_loop
-	jmp	.end			;       return false; /* eax (the return value) is already 0 */
-					;   } /* end while(1) unary part */
-
-	ALIGN 16
-.break1:
-	;; ecx		cbits
-	;; esi		cwords
-	;; edi		uval
-	;; ebp		br
-	;; [esp]	ucbits
-	sub	[esp], edi		;   ucbits -= uval;
-	sub	dword [esp], byte 1	;   ucbits--; /* account for stop bit */
-
-	;
-	; read binary part
-	;
-	mov	ebx, [esp + 36]		;   ebx <- parameter
-	test	ebx, ebx		;   if(parameter) {
-	jz	near .break2
-.read2:
-	cmp	[esp], ebx		;     while(ucbits < parameter) {
-	jae	.c2_next1
-	; flush registers and read; bitreader_read_from_client_() does
-	; not touch br->consumed_bits at all but we still need to set
-	; it in case it fails and we have to return false.
-	mov	[ebp + 16], esi		;       br->consumed_words = cwords;
-	mov	[ebp + 20], ecx		;       br->consumed_bits = cbits;
-	push	ecx			;       /* save */
-	push	ebp			;       /* push br argument */
-%ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
-	call	_bitreader_read_from_client_
-%else
-	call	bitreader_read_from_client_
-%endif
-	pop	edx			;       /* discard, unused */
-	pop	ecx			;       /* restore */
-	mov	esi, [ebp + 16]		;       cwords = br->consumed_words;
-					;       ucbits = (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits;
-	mov	edx, [ebp + 8]		;         edx <- br->words
-	sub	edx, esi		;         edx <- br->words-cwords
-	shl	edx, 2			;         edx <- (br->words-cwords)*FLAC__BYTES_PER_WORD
-	add	edx, [ebp + 12]		;         edx <- (br->words-cwords)*FLAC__BYTES_PER_WORD + br->bytes
-	shl	edx, 3			;         edx <- (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8
-	sub	edx, ecx		;         edx <- (br->words-cwords)*FLAC__BITS_PER_WORD + br->bytes*8 - cbits
-	mov	[esp], edx		;         ucbits <- edx
-	test	eax, eax		;       if(!bitreader_read_from_client_(br))
-	jnz	.read2
-	jmp	.end			;         return false; /* eax (the return value) is already 0 */
-					;     }
-.c2_next1:
-	;; ebx		parameter
-	;; ecx		cbits
-	;; esi		cwords
-	;; edi		uval
-	;; ebp		br
-	;; [esp]	ucbits
-	cmp	esi, [ebp + 8]		;     if(cwords < br->words) { /* if we've not consumed up to a partial tail word... */
-	jae	near .c2_next2
-	test	ecx, ecx		;       if(cbits) {
-	jz	near .c2_next3		;         /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */
-	mov	eax, 32
-	mov	edx, [ebp]
-	sub	eax, ecx		;         const unsigned n = FLAC__BITS_PER_WORD - cbits;
-	mov	edx, [edx + 4*esi]	;         const brword word = br->buffer[cwords];
-	cmp	ebx, eax		;         if(parameter < n) {
-	jae	.c2_next4
-					;           uval <<= parameter;
-					;           uval |= (word & (FLAC__WORD_ALL_ONES >> cbits)) >> (n-parameter);
-	shl	edx, cl
-	xchg	ebx, ecx
-	shld	edi, edx, cl
-	add	ebx, ecx		;           cbits += parameter;
-	xchg	ebx, ecx		;           ebx <- parameter, ecx <- cbits
-	jmp	.break2			;           goto break2;
-					;         }
-.c2_next4:
-					;         uval <<= n;
-					;         uval |= word & (FLAC__WORD_ALL_ONES >> cbits);
-%if 1
-	rol	edx, cl			;            @@@@@@OPT: may be faster to use rol to save edx so we can restore it for CRC'ing
-					;            @@@@@@OPT: or put parameter in ch instead and free up ebx completely again
-%else
-	shl	edx, cl
-%endif
-	xchg	eax, ecx
-	shld	edi, edx, cl
-	xchg	eax, ecx
-%if 1
-	ror	edx, cl			;            restored.
-%else
-	mov	edx, [ebp]
-	mov	edx, [edx + 4*esi]
-%endif
-					;         crc16_update_word_(br, br->buffer[cwords]);
-	push	edi			;		[need more registers]
-	push	ebx			;		[need more registers]
-	push	eax			;		[need more registers]
-	bswap	edx			;		edx = br->buffer[cwords] swapped; now we can CRC the bytes from LSByte to MSByte which makes things much easier
-	mov	ecx, [ebp + 28]		;		ecx <- br->crc16_align
-	mov	eax, [ebp + 24]		;		ax <- br->read_crc (a.k.a. crc)
-%ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
-	mov	edi, _FLAC__crc16_table
-%else
-	mov	edi, FLAC__crc16_table
-%endif
-	;; eax (ax)	crc a.k.a. br->read_crc
-	;; ebx (bl)	intermediate result index into FLAC__crc16_table[]
-	;; ecx		br->crc16_align
-	;; edx		byteswapped brword to CRC
-	;; esi		cwords
-	;; edi		unsigned FLAC__crc16_table[]
-	;; ebp		br
-	test	ecx, ecx		;		switch(br->crc16_align) ...
-	jnz	.c2b4			;		[br->crc16_align is 0 the vast majority of the time so we optimize the common case]
-.c2b0:	xor	dl, ah			;		dl <- (crc>>8)^(word>>24)
-	movzx	ebx, dl
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^(word>>24)]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^(word>>24)]
-.c2b1:	xor	dh, ah			;		dh <- (crc>>8)^((word>>16)&0xff))
-	movzx	ebx, dh
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^((word>>16)&0xff))]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^((word>>16)&0xff))]
-	shr	edx, 16
-.c2b2:	xor	dl, ah			;		dl <- (crc>>8)^((word>>8)&0xff))
-	movzx	ebx, dl
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^((word>>8)&0xff))]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^((word>>8)&0xff))]
-.c2b3:	xor	dh, ah			;		dh <- (crc>>8)^(word&0xff)
-	movzx	ebx, dh
-	mov	ecx, [ebx*4 + edi]	;		cx <- FLAC__crc16_table[(crc>>8)^(word&0xff)]
-	shl	eax, 8			;		ax <- (crc<<8)
-	xor	eax, ecx		;		crc <- ax <- (crc<<8) ^ FLAC__crc16_table[(crc>>8)^(word&0xff)]
-	movzx	eax, ax
-	mov	[ebp + 24], eax		;		br->read_crc <- crc
-	pop	eax
-	pop	ebx
-	pop	edi
-	add	esi, byte 1		;         cwords++;
-	mov	ecx, ebx
-	sub	ecx, eax		;         cbits = parameter - n;
-	jz	.break2			;         if(cbits) { /* parameter > n, i.e. if there are still bits left to read, there have to be less than 32 so they will all be in the next word */
-					;           uval <<= cbits;
-					;           uval |= (br->buffer[cwords] >> (FLAC__BITS_PER_WORD-cbits));
-	mov	eax, [ebp]
-	mov	eax, [eax + 4*esi]
-	shld	edi, eax, cl
-					;         }
-	jmp	.break2			;         goto break2;
-
-	;; this section relocated out of the way for performance
-.c2b4:
-	mov	[ebp + 28], dword 0	;		br->crc16_align <- 0
-	cmp	ecx, 8
-	je	.c2b1
-	shr	edx, 16
-	cmp	ecx, 16
-	je	.c2b2
-	jmp	.c2b3
-
-.c2_next3:				;       } else {
-	mov	ecx, ebx		;         cbits = parameter;
-					;         uval <<= cbits;
-					;         uval |= (br->buffer[cwords] >> (FLAC__BITS_PER_WORD-cbits));
-	mov	eax, [ebp]
-	mov	eax, [eax + 4*esi]
-	shld	edi, eax, cl
-	jmp	.break2			;         goto break2;
-					;       }
-.c2_next2:				;     } else {
-	; in this case we're starting our read at a partial tail word;
-	; the reader has guaranteed that we have at least 'parameter'
-	; bits available to read, which makes this case simpler.
-					;       uval <<= parameter;
-					;       if(cbits) {
-					;         /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */
-					;         uval |= (br->buffer[cwords] & (FLAC__WORD_ALL_ONES >> cbits)) >> (FLAC__BITS_PER_WORD-cbits-parameter);
-					;         cbits += parameter;
-					;         goto break2;
-					;       } else {
-					;         cbits = parameter;
-					;         uval |= br->buffer[cwords] >> (FLAC__BITS_PER_WORD-cbits);
-					;         goto break2;
-					;       }
-					;       the above is much shorter in assembly:
-	mov	eax, [ebp]
-	mov	eax, [eax + 4*esi]	;       eax <- br->buffer[cwords]
-	shl	eax, cl			;       eax <- br->buffer[cwords] << cbits
-	add	ecx, ebx		;       cbits += parameter
-	xchg	ebx, ecx		;       ebx <- cbits, ecx <- parameter
-	shld	edi, eax, cl		;       uval <<= parameter <<< 'parameter' bits of tail word
-	xchg	ebx, ecx		;       ebx <- parameter, ecx <- cbits
-					;     }
-					;   }
-.break2:
-	sub	[esp], ebx		;   ucbits -= parameter;
-
-	;
-	; compose the value
-	;
-	mov	ebx, [esp + 28]		;   ebx <- vals
-	mov	edx, edi		;   edx <- uval
-	and	edi, 1			;   edi <- uval & 1
-	shr	edx, 1			;   edx <- uval >> 1
-	neg	edi			;   edi <- -(int)(uval & 1)
-	xor	edx, edi		;   edx <- (uval >> 1 ^ -(int)(uval & 1))
-	mov	[ebx], edx		;   *vals <- edx
-	sub	dword [esp + 32], byte 1	;   --nvals;
-	jz	.finished		;   if(nvals == 0) /* jump to finish */
-	xor	edi, edi		;   uval = 0;
-	add	dword [esp + 28], 4	;   ++vals
-	jmp	.val_loop		; }
-
-.finished:
-	mov	[ebp + 16], esi		; br->consumed_words = cwords;
-	mov	[ebp + 20], ecx		; br->consumed_bits = cbits;
-	mov	eax, 1
-.end:
-	add	esp, 4
-	pop	edi
-	pop	esi
-	pop	ebx
-	pop	ebp
-	ret
-
-end
-
-%ifdef OBJ_FORMAT_elf
-	section .note.GNU-stack noalloc
-%endif
diff --git a/libFLAC/ia32/cpu_asm.nasm b/libFLAC/ia32/cpu_asm.nasm
deleted file mode 100644
index f5eb110..0000000
--- a/libFLAC/ia32/cpu_asm.nasm
+++ /dev/null
@@ -1,121 +0,0 @@
-;  vim:filetype=nasm ts=8
-
-;  libFLAC - Free Lossless Audio Codec library
-;  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-;
-;  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-;  contributors may be used to endorse or promote products derived from
-;  this software without specific prior written permission.
-;
-;  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 FOUNDATION 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.
-
-%include "nasm.h"
-
-	data_section
-
-cglobal FLAC__cpu_have_cpuid_asm_ia32
-cglobal FLAC__cpu_info_asm_ia32
-cglobal FLAC__cpu_info_extended_amd_asm_ia32
-
-	code_section
-
-; **********************************************************************
-;
-; FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32()
-;
-
-cident FLAC__cpu_have_cpuid_asm_ia32
-	push	ebx
-	pushfd
-	pop	eax
-	mov	edx, eax
-	xor	eax, 0x00200000
-	push	eax
-	popfd
-	pushfd
-	pop	eax
-	cmp	eax, edx
-	jz	.no_cpuid
-	mov	eax, 1
-	jmp	.end
-.no_cpuid:
-	xor	eax, eax
-.end:
-	pop	ebx
-	ret
-
-; **********************************************************************
-;
-; void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx)
-;
-
-cident FLAC__cpu_info_asm_ia32
-	;[esp + 8] == flags_edx
-	;[esp + 12] == flags_ecx
-
-	push	ebx
-	call	FLAC__cpu_have_cpuid_asm_ia32
-	test	eax, eax
-	jz	.no_cpuid
-	mov	eax, 1
-	cpuid
-	mov	ebx, [esp + 8]
-	mov	[ebx], edx
-	mov	ebx, [esp + 12]
-	mov	[ebx], ecx
-	jmp	.end
-.no_cpuid
-	xor	eax, eax
-	mov	ebx, [esp + 8]
-	mov	[ebx], eax
-	mov	ebx, [esp + 12]
-	mov	[ebx], eax
-.end
-	pop	ebx
-	ret
-
-cident FLAC__cpu_info_extended_amd_asm_ia32
-	push	ebx
-	call	FLAC__cpu_have_cpuid_asm_ia32
-	test	eax, eax
-	jz	.no_cpuid
-	mov	eax, 0x80000000
-	cpuid
-	cmp	eax, 0x80000001
-	jb	.no_cpuid
-	mov	eax, 0x80000001
-	cpuid
-	mov	eax, edx
-	jmp	.end
-.no_cpuid
-	xor	eax, eax
-.end
-	pop	ebx
-	ret
-
-end
-
-%ifdef OBJ_FORMAT_elf
-       section .note.GNU-stack noalloc
-%endif
diff --git a/libFLAC/ia32/fixed_asm.nasm b/libFLAC/ia32/fixed_asm.nasm
deleted file mode 100644
index 0185f4d..0000000
--- a/libFLAC/ia32/fixed_asm.nasm
+++ /dev/null
@@ -1,312 +0,0 @@
-;  vim:filetype=nasm ts=8
-
-;  libFLAC - Free Lossless Audio Codec library
-;  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-;
-;  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-;  contributors may be used to endorse or promote products derived from
-;  this software without specific prior written permission.
-;
-;  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 FOUNDATION 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.
-
-%include "nasm.h"
-
-	data_section
-
-cglobal FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov
-
-	code_section
-
-; **********************************************************************
-;
-; unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 *data, unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1])
-; {
-; 	FLAC__int32 last_error_0 = data[-1];
-; 	FLAC__int32 last_error_1 = data[-1] - data[-2];
-; 	FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]);
-; 	FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]);
-; 	FLAC__int32 error, save;
-; 	FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0;
-; 	unsigned i, order;
-;
-; 	for(i = 0; i < data_len; i++) {
-; 		error  = data[i]     ; total_error_0 += local_abs(error);                      save = error;
-; 		error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error;
-; 		error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error;
-; 		error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error;
-; 		error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save;
-; 	}
-;
-; 	if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4))
-; 		order = 0;
-; 	else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4))
-; 		order = 1;
-; 	else if(total_error_2 < min(total_error_3, total_error_4))
-; 		order = 2;
-; 	else if(total_error_3 < total_error_4)
-; 		order = 3;
-; 	else
-; 		order = 4;
-;
-; 	residual_bits_per_sample[0] = (FLAC__float)((data_len > 0 && total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0);
-; 	residual_bits_per_sample[1] = (FLAC__float)((data_len > 0 && total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0);
-; 	residual_bits_per_sample[2] = (FLAC__float)((data_len > 0 && total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0);
-; 	residual_bits_per_sample[3] = (FLAC__float)((data_len > 0 && total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0);
-; 	residual_bits_per_sample[4] = (FLAC__float)((data_len > 0 && total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0);
-;
-; 	return order;
-; }
-	ALIGN 16
-cident FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov
-
-	; esp + 36 == data[]
-	; esp + 40 == data_len
-	; esp + 44 == residual_bits_per_sample[]
-
-	push	ebp
-	push	ebx
-	push	esi
-	push	edi
-	sub	esp, byte 16
-	; qword [esp] == temp space for loading FLAC__uint64s to FPU regs
-
-	; ebx == &data[i]
-	; ecx == loop counter (i)
-	; ebp == order
-	; mm0 == total_error_1:total_error_0
-	; mm1 == total_error_2:total_error_3
-	; mm2 == :total_error_4
-	; mm3 == last_error_1:last_error_0
-	; mm4 == last_error_2:last_error_3
-
-	mov	ecx, [esp + 40]			; ecx = data_len
-	test	ecx, ecx
-	jz	near .data_len_is_0
-
-	mov	ebx, [esp + 36]			; ebx = data[]
-	movd	mm3, [ebx - 4]			; mm3 = 0:last_error_0
-	movd	mm2, [ebx - 8]			; mm2 = 0:data[-2]
-	movd	mm1, [ebx - 12]			; mm1 = 0:data[-3]
-	movd	mm0, [ebx - 16]			; mm0 = 0:data[-4]
-	movq	mm5, mm3			; mm5 = 0:last_error_0
-	psubd	mm5, mm2			; mm5 = 0:last_error_1
-	punpckldq	mm3, mm5		; mm3 = last_error_1:last_error_0
-	psubd	mm2, mm1			; mm2 = 0:data[-2] - data[-3]
-	psubd	mm5, mm2			; mm5 = 0:last_error_2
-	movq	mm4, mm5			; mm4 = 0:last_error_2
-	psubd	mm4, mm2			; mm4 = 0:last_error_2 - (data[-2] - data[-3])
-	paddd	mm4, mm1			; mm4 = 0:last_error_2 - (data[-2] - 2 * data[-3])
-	psubd	mm4, mm0			; mm4 = 0:last_error_3
-	punpckldq	mm4, mm5		; mm4 = last_error_2:last_error_3
-	pxor	mm0, mm0			; mm0 = total_error_1:total_error_0
-	pxor	mm1, mm1			; mm1 = total_error_2:total_error_3
-	pxor	mm2, mm2			; mm2 = 0:total_error_4
-
-	ALIGN 16
-.loop:
-	movd	mm7, [ebx]			; mm7 = 0:error_0
-	add	ebx, byte 4
-	movq	mm6, mm7			; mm6 = 0:error_0
-	psubd	mm7, mm3			; mm7 = :error_1
-	punpckldq	mm6, mm7		; mm6 = error_1:error_0
-	movq	mm5, mm6			; mm5 = error_1:error_0
-	movq	mm7, mm6			; mm7 = error_1:error_0
-	psubd	mm5, mm3			; mm5 = error_2:
-	movq	mm3, mm6			; mm3 = error_1:error_0	
-	psrad	mm6, 31
-	pxor	mm7, mm6
-	psubd	mm7, mm6			; mm7 = abs(error_1):abs(error_0)
-	paddd	mm0, mm7			; mm0 = total_error_1:total_error_0
-	movq	mm6, mm5			; mm6 = error_2:
-	psubd	mm5, mm4			; mm5 = error_3:
-	punpckhdq	mm5, mm6		; mm5 = error_2:error_3
-	movq	mm7, mm5			; mm7 = error_2:error_3
-	movq	mm6, mm5			; mm6 = error_2:error_3
-	psubd	mm5, mm4			; mm5 = :error_4
-	movq	mm4, mm6			; mm4 = error_2:error_3
-	psrad	mm6, 31
-	pxor	mm7, mm6
-	psubd	mm7, mm6			; mm7 = abs(error_2):abs(error_3)
-	paddd	mm1, mm7			; mm1 = total_error_2:total_error_3
-	movq	mm6, mm5			; mm6 = :error_4
-	psrad	mm5, 31
-	pxor	mm6, mm5
-	psubd	mm6, mm5			; mm6 = :abs(error_4)
-	paddd	mm2, mm6			; mm2 = :total_error_4
-	
-	dec	ecx
-	jnz	short .loop
-
-; 	if(total_error_0 < min(min(min(total_error_1, total_error_2), total_error_3), total_error_4))
-; 		order = 0;
-; 	else if(total_error_1 < min(min(total_error_2, total_error_3), total_error_4))
-; 		order = 1;
-; 	else if(total_error_2 < min(total_error_3, total_error_4))
-; 		order = 2;
-; 	else if(total_error_3 < total_error_4)
-; 		order = 3;
-; 	else
-; 		order = 4;
-	movq	mm3, mm0			; mm3 = total_error_1:total_error_0
-	movd	edi, mm2			; edi = total_error_4
-	movd	esi, mm1			; esi = total_error_3
-	movd	eax, mm0			; eax = total_error_0
-	punpckhdq	mm1, mm1		; mm1 = total_error_2:total_error_2
-	punpckhdq	mm3, mm3		; mm3 = total_error_1:total_error_1
-	movd	edx, mm1			; edx = total_error_2
-	movd	ecx, mm3			; ecx = total_error_1
-
-	xor	ebx, ebx
-	xor	ebp, ebp
-	inc	ebx
-	cmp	ecx, eax
-	cmovb	eax, ecx			; eax = min(total_error_0, total_error_1)
-	cmovbe	ebp, ebx
-	inc	ebx
-	cmp	edx, eax
-	cmovb	eax, edx			; eax = min(total_error_0, total_error_1, total_error_2)
-	cmovbe	ebp, ebx
-	inc	ebx
-	cmp	esi, eax
-	cmovb	eax, esi			; eax = min(total_error_0, total_error_1, total_error_2, total_error_3)
-	cmovbe	ebp, ebx
-	inc	ebx
-	cmp	edi, eax
-	cmovb	eax, edi			; eax = min(total_error_0, total_error_1, total_error_2, total_error_3, total_error_4)
-	cmovbe	ebp, ebx
-	movd	ebx, mm0			; ebx = total_error_0
-	emms
-
-	; 	residual_bits_per_sample[0] = (FLAC__float)((data_len > 0 && total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0);
-	; 	residual_bits_per_sample[1] = (FLAC__float)((data_len > 0 && total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0);
-	; 	residual_bits_per_sample[2] = (FLAC__float)((data_len > 0 && total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0);
-	; 	residual_bits_per_sample[3] = (FLAC__float)((data_len > 0 && total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0);
-	; 	residual_bits_per_sample[4] = (FLAC__float)((data_len > 0 && total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0);
-	xor	eax, eax
-	fild	dword [esp + 40]		; ST = data_len (NOTE: assumes data_len is <2gigs)
-.rbps_0:
-	test	ebx, ebx
-	jz	.total_error_0_is_0
-	fld1					; ST = 1.0 data_len
-	mov	[esp], ebx
-	mov	[esp + 4], eax			; [esp] = (FLAC__uint64)total_error_0
-	mov	ebx, [esp + 44]
-	fild	qword [esp]			; ST = total_error_0 1.0 data_len
-	fdiv	st2				; ST = total_error_0/data_len 1.0 data_len
-	fldln2					; ST = ln2 total_error_0/data_len 1.0 data_len
-	fmulp	st1				; ST = ln2*total_error_0/data_len 1.0 data_len
-	fyl2x					; ST = log2(ln2*total_error_0/data_len) data_len
-	fstp	dword [ebx]			; residual_bits_per_sample[0] = log2(ln2*total_error_0/data_len)   ST = data_len
-	jmp	short .rbps_1
-.total_error_0_is_0:
-	mov	ebx, [esp + 44]
-	mov	[ebx], eax			; residual_bits_per_sample[0] = 0.0
-.rbps_1:
-	test	ecx, ecx
-	jz	.total_error_1_is_0
-	fld1					; ST = 1.0 data_len
-	mov	[esp], ecx
-	mov	[esp + 4], eax			; [esp] = (FLAC__uint64)total_error_1
-	fild	qword [esp]			; ST = total_error_1 1.0 data_len
-	fdiv	st2				; ST = total_error_1/data_len 1.0 data_len
-	fldln2					; ST = ln2 total_error_1/data_len 1.0 data_len
-	fmulp	st1				; ST = ln2*total_error_1/data_len 1.0 data_len
-	fyl2x					; ST = log2(ln2*total_error_1/data_len) data_len
-	fstp	dword [ebx + 4]			; residual_bits_per_sample[1] = log2(ln2*total_error_1/data_len)   ST = data_len
-	jmp	short .rbps_2
-.total_error_1_is_0:
-	mov	[ebx + 4], eax			; residual_bits_per_sample[1] = 0.0
-.rbps_2:
-	test	edx, edx
-	jz	.total_error_2_is_0
-	fld1					; ST = 1.0 data_len
-	mov	[esp], edx
-	mov	[esp + 4], eax			; [esp] = (FLAC__uint64)total_error_2
-	fild	qword [esp]			; ST = total_error_2 1.0 data_len
-	fdiv	st2				; ST = total_error_2/data_len 1.0 data_len
-	fldln2					; ST = ln2 total_error_2/data_len 1.0 data_len
-	fmulp	st1				; ST = ln2*total_error_2/data_len 1.0 data_len
-	fyl2x					; ST = log2(ln2*total_error_2/data_len) data_len
-	fstp	dword [ebx + 8]			; residual_bits_per_sample[2] = log2(ln2*total_error_2/data_len)   ST = data_len
-	jmp	short .rbps_3
-.total_error_2_is_0:
-	mov	[ebx + 8], eax			; residual_bits_per_sample[2] = 0.0
-.rbps_3:
-	test	esi, esi
-	jz	.total_error_3_is_0
-	fld1					; ST = 1.0 data_len
-	mov	[esp], esi
-	mov	[esp + 4], eax			; [esp] = (FLAC__uint64)total_error_3
-	fild	qword [esp]			; ST = total_error_3 1.0 data_len
-	fdiv	st2				; ST = total_error_3/data_len 1.0 data_len
-	fldln2					; ST = ln2 total_error_3/data_len 1.0 data_len
-	fmulp	st1				; ST = ln2*total_error_3/data_len 1.0 data_len
-	fyl2x					; ST = log2(ln2*total_error_3/data_len) data_len
-	fstp	dword [ebx + 12]		; residual_bits_per_sample[3] = log2(ln2*total_error_3/data_len)   ST = data_len
-	jmp	short .rbps_4
-.total_error_3_is_0:
-	mov	[ebx + 12], eax			; residual_bits_per_sample[3] = 0.0
-.rbps_4:
-	test	edi, edi
-	jz	.total_error_4_is_0
-	fld1					; ST = 1.0 data_len
-	mov	[esp], edi
-	mov	[esp + 4], eax			; [esp] = (FLAC__uint64)total_error_4
-	fild	qword [esp]			; ST = total_error_4 1.0 data_len
-	fdiv	st2				; ST = total_error_4/data_len 1.0 data_len
-	fldln2					; ST = ln2 total_error_4/data_len 1.0 data_len
-	fmulp	st1				; ST = ln2*total_error_4/data_len 1.0 data_len
-	fyl2x					; ST = log2(ln2*total_error_4/data_len) data_len
-	fstp	dword [ebx + 16]		; residual_bits_per_sample[4] = log2(ln2*total_error_4/data_len)   ST = data_len
-	jmp	short .rbps_end
-.total_error_4_is_0:
-	mov	[ebx + 16], eax			; residual_bits_per_sample[4] = 0.0
-.rbps_end:
-	fstp	st0				; ST = [empty]
-	jmp	short .end
-.data_len_is_0:
-	; data_len == 0, so residual_bits_per_sample[*] = 0.0
-	xor	ebp, ebp
-	mov	edi, [esp + 44]
-	mov	[edi], ebp
-	mov	[edi + 4], ebp
-	mov	[edi + 8], ebp
-	mov	[edi + 12], ebp
-	mov	[edi + 16], ebp
-	add	ebp, byte 4			; order = 4
-
-.end:
-	mov	eax, ebp			; return order
-	add	esp, byte 16
-	pop	edi
-	pop	esi
-	pop	ebx
-	pop	ebp
-	ret
-
-end
-
-%ifdef OBJ_FORMAT_elf
-       section .note.GNU-stack noalloc
-%endif
diff --git a/libFLAC/ia32/lpc_asm.nasm b/libFLAC/ia32/lpc_asm.nasm
deleted file mode 100644
index 4bc4c91..0000000
--- a/libFLAC/ia32/lpc_asm.nasm
+++ /dev/null
@@ -1,1511 +0,0 @@
-;  vim:filetype=nasm ts=8
-
-;  libFLAC - Free Lossless Audio Codec library
-;  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-;
-;  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-;  contributors may be used to endorse or promote products derived from
-;  this software without specific prior written permission.
-;
-;  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 FOUNDATION 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.
-
-%include "nasm.h"
-
-	data_section
-
-cglobal FLAC__lpc_compute_autocorrelation_asm_ia32
-cglobal FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4
-cglobal FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8
-cglobal FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12
-cglobal FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow
-cglobal FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32
-cglobal FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx
-cglobal FLAC__lpc_restore_signal_asm_ia32
-cglobal FLAC__lpc_restore_signal_asm_ia32_mmx
-
-	code_section
-
-; **********************************************************************
-;
-; void FLAC__lpc_compute_autocorrelation_asm(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
-; {
-;	FLAC__real d;
-;	unsigned sample, coeff;
-;	const unsigned limit = data_len - lag;
-;
-;	FLAC__ASSERT(lag > 0);
-;	FLAC__ASSERT(lag <= data_len);
-;
-;	for(coeff = 0; coeff < lag; coeff++)
-;		autoc[coeff] = 0.0;
-;	for(sample = 0; sample <= limit; sample++) {
-;		d = data[sample];
-;		for(coeff = 0; coeff < lag; coeff++)
-;			autoc[coeff] += d * data[sample+coeff];
-;	}
-;	for(; sample < data_len; sample++) {
-;		d = data[sample];
-;		for(coeff = 0; coeff < data_len - sample; coeff++)
-;			autoc[coeff] += d * data[sample+coeff];
-;	}
-; }
-;
-	ALIGN 16
-cident FLAC__lpc_compute_autocorrelation_asm_ia32
-	;[esp + 28] == autoc[]
-	;[esp + 24] == lag
-	;[esp + 20] == data_len
-	;[esp + 16] == data[]
-
-	;ASSERT(lag > 0)
-	;ASSERT(lag <= 33)
-	;ASSERT(lag <= data_len)
-
-.begin:
-	push	esi
-	push	edi
-	push	ebx
-
-	;	for(coeff = 0; coeff < lag; coeff++)
-	;		autoc[coeff] = 0.0;
-	mov	edi, [esp + 28]			; edi == autoc
-	mov	ecx, [esp + 24]			; ecx = # of dwords (=lag) of 0 to write
-	xor	eax, eax
-	rep	stosd
-
-	;	const unsigned limit = data_len - lag;
-	mov	eax, [esp + 24]			; eax == lag
-	mov	ecx, [esp + 20]
-	sub	ecx, eax			; ecx == limit
-
-	mov	edi, [esp + 28]			; edi == autoc
-	mov	esi, [esp + 16]			; esi == data
-	inc	ecx				; we are looping <= limit so we add one to the counter
-
-	;	for(sample = 0; sample <= limit; sample++) {
-	;		d = data[sample];
-	;		for(coeff = 0; coeff < lag; coeff++)
-	;			autoc[coeff] += d * data[sample+coeff];
-	;	}
-	fld	dword [esi]			; ST = d <- data[sample]
-	; each iteration is 11 bytes so we need (-eax)*11, so we do (-12*eax + eax)
-	lea	edx, [eax + eax*2]
-	neg	edx
-	lea	edx, [eax + edx*4 + .jumper1_0 - .get_eip1]
-	call	.get_eip1
-.get_eip1:
-	pop	ebx
-	add	edx, ebx
-	inc	edx				; compensate for the shorter opcode on the last iteration
-	inc	edx				; compensate for the shorter opcode on the last iteration
-	inc	edx				; compensate for the shorter opcode on the last iteration
-	cmp	eax, 33
-	jne	.loop1_start
-	sub	edx, byte 9			; compensate for the longer opcodes on the first iteration
-.loop1_start:
-	jmp	edx
-
-	fld	st0				; ST = d d
-	fmul	dword [esi + (32*4)]		; ST = d*data[sample+32] d		WATCHOUT: not a byte displacement here!
-	fadd	dword [edi + (32*4)]		; ST = autoc[32]+d*data[sample+32] d	WATCHOUT: not a byte displacement here!
-	fstp	dword [edi + (32*4)]		; autoc[32]+=d*data[sample+32]  ST = d	WATCHOUT: not a byte displacement here!
-	fld	st0				; ST = d d
-	fmul	dword [esi + (31*4)]		; ST = d*data[sample+31] d
-	fadd	dword [edi + (31*4)]		; ST = autoc[31]+d*data[sample+31] d
-	fstp	dword [edi + (31*4)]		; autoc[31]+=d*data[sample+31]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (30*4)]		; ST = d*data[sample+30] d
-	fadd	dword [edi + (30*4)]		; ST = autoc[30]+d*data[sample+30] d
-	fstp	dword [edi + (30*4)]		; autoc[30]+=d*data[sample+30]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (29*4)]		; ST = d*data[sample+29] d
-	fadd	dword [edi + (29*4)]		; ST = autoc[29]+d*data[sample+29] d
-	fstp	dword [edi + (29*4)]		; autoc[29]+=d*data[sample+29]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (28*4)]		; ST = d*data[sample+28] d
-	fadd	dword [edi + (28*4)]		; ST = autoc[28]+d*data[sample+28] d
-	fstp	dword [edi + (28*4)]		; autoc[28]+=d*data[sample+28]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (27*4)]		; ST = d*data[sample+27] d
-	fadd	dword [edi + (27*4)]		; ST = autoc[27]+d*data[sample+27] d
-	fstp	dword [edi + (27*4)]		; autoc[27]+=d*data[sample+27]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (26*4)]		; ST = d*data[sample+26] d
-	fadd	dword [edi + (26*4)]		; ST = autoc[26]+d*data[sample+26] d
-	fstp	dword [edi + (26*4)]		; autoc[26]+=d*data[sample+26]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (25*4)]		; ST = d*data[sample+25] d
-	fadd	dword [edi + (25*4)]		; ST = autoc[25]+d*data[sample+25] d
-	fstp	dword [edi + (25*4)]		; autoc[25]+=d*data[sample+25]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (24*4)]		; ST = d*data[sample+24] d
-	fadd	dword [edi + (24*4)]		; ST = autoc[24]+d*data[sample+24] d
-	fstp	dword [edi + (24*4)]		; autoc[24]+=d*data[sample+24]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (23*4)]		; ST = d*data[sample+23] d
-	fadd	dword [edi + (23*4)]		; ST = autoc[23]+d*data[sample+23] d
-	fstp	dword [edi + (23*4)]		; autoc[23]+=d*data[sample+23]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (22*4)]		; ST = d*data[sample+22] d
-	fadd	dword [edi + (22*4)]		; ST = autoc[22]+d*data[sample+22] d
-	fstp	dword [edi + (22*4)]		; autoc[22]+=d*data[sample+22]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (21*4)]		; ST = d*data[sample+21] d
-	fadd	dword [edi + (21*4)]		; ST = autoc[21]+d*data[sample+21] d
-	fstp	dword [edi + (21*4)]		; autoc[21]+=d*data[sample+21]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (20*4)]		; ST = d*data[sample+20] d
-	fadd	dword [edi + (20*4)]		; ST = autoc[20]+d*data[sample+20] d
-	fstp	dword [edi + (20*4)]		; autoc[20]+=d*data[sample+20]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (19*4)]		; ST = d*data[sample+19] d
-	fadd	dword [edi + (19*4)]		; ST = autoc[19]+d*data[sample+19] d
-	fstp	dword [edi + (19*4)]		; autoc[19]+=d*data[sample+19]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (18*4)]		; ST = d*data[sample+18] d
-	fadd	dword [edi + (18*4)]		; ST = autoc[18]+d*data[sample+18] d
-	fstp	dword [edi + (18*4)]		; autoc[18]+=d*data[sample+18]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (17*4)]		; ST = d*data[sample+17] d
-	fadd	dword [edi + (17*4)]		; ST = autoc[17]+d*data[sample+17] d
-	fstp	dword [edi + (17*4)]		; autoc[17]+=d*data[sample+17]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (16*4)]		; ST = d*data[sample+16] d
-	fadd	dword [edi + (16*4)]		; ST = autoc[16]+d*data[sample+16] d
-	fstp	dword [edi + (16*4)]		; autoc[16]+=d*data[sample+16]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (15*4)]		; ST = d*data[sample+15] d
-	fadd	dword [edi + (15*4)]		; ST = autoc[15]+d*data[sample+15] d
-	fstp	dword [edi + (15*4)]		; autoc[15]+=d*data[sample+15]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (14*4)]		; ST = d*data[sample+14] d
-	fadd	dword [edi + (14*4)]		; ST = autoc[14]+d*data[sample+14] d
-	fstp	dword [edi + (14*4)]		; autoc[14]+=d*data[sample+14]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (13*4)]		; ST = d*data[sample+13] d
-	fadd	dword [edi + (13*4)]		; ST = autoc[13]+d*data[sample+13] d
-	fstp	dword [edi + (13*4)]		; autoc[13]+=d*data[sample+13]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (12*4)]		; ST = d*data[sample+12] d
-	fadd	dword [edi + (12*4)]		; ST = autoc[12]+d*data[sample+12] d
-	fstp	dword [edi + (12*4)]		; autoc[12]+=d*data[sample+12]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (11*4)]		; ST = d*data[sample+11] d
-	fadd	dword [edi + (11*4)]		; ST = autoc[11]+d*data[sample+11] d
-	fstp	dword [edi + (11*4)]		; autoc[11]+=d*data[sample+11]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (10*4)]		; ST = d*data[sample+10] d
-	fadd	dword [edi + (10*4)]		; ST = autoc[10]+d*data[sample+10] d
-	fstp	dword [edi + (10*4)]		; autoc[10]+=d*data[sample+10]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 9*4)]		; ST = d*data[sample+9] d
-	fadd	dword [edi + ( 9*4)]		; ST = autoc[9]+d*data[sample+9] d
-	fstp	dword [edi + ( 9*4)]		; autoc[9]+=d*data[sample+9]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 8*4)]		; ST = d*data[sample+8] d
-	fadd	dword [edi + ( 8*4)]		; ST = autoc[8]+d*data[sample+8] d
-	fstp	dword [edi + ( 8*4)]		; autoc[8]+=d*data[sample+8]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 7*4)]		; ST = d*data[sample+7] d
-	fadd	dword [edi + ( 7*4)]		; ST = autoc[7]+d*data[sample+7] d
-	fstp	dword [edi + ( 7*4)]		; autoc[7]+=d*data[sample+7]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 6*4)]		; ST = d*data[sample+6] d
-	fadd	dword [edi + ( 6*4)]		; ST = autoc[6]+d*data[sample+6] d
-	fstp	dword [edi + ( 6*4)]		; autoc[6]+=d*data[sample+6]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 5*4)]		; ST = d*data[sample+4] d
-	fadd	dword [edi + ( 5*4)]		; ST = autoc[4]+d*data[sample+4] d
-	fstp	dword [edi + ( 5*4)]		; autoc[4]+=d*data[sample+4]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 4*4)]		; ST = d*data[sample+4] d
-	fadd	dword [edi + ( 4*4)]		; ST = autoc[4]+d*data[sample+4] d
-	fstp	dword [edi + ( 4*4)]		; autoc[4]+=d*data[sample+4]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 3*4)]		; ST = d*data[sample+3] d
-	fadd	dword [edi + ( 3*4)]		; ST = autoc[3]+d*data[sample+3] d
-	fstp	dword [edi + ( 3*4)]		; autoc[3]+=d*data[sample+3]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 2*4)]		; ST = d*data[sample+2] d
-	fadd	dword [edi + ( 2*4)]		; ST = autoc[2]+d*data[sample+2] d
-	fstp	dword [edi + ( 2*4)]		; autoc[2]+=d*data[sample+2]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 1*4)]		; ST = d*data[sample+1] d
-	fadd	dword [edi + ( 1*4)]		; ST = autoc[1]+d*data[sample+1] d
-	fstp	dword [edi + ( 1*4)]		; autoc[1]+=d*data[sample+1]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi]			; ST = d*data[sample] d			WATCHOUT: no displacement byte here!
-	fadd	dword [edi]			; ST = autoc[0]+d*data[sample] d	WATCHOUT: no displacement byte here!
-	fstp	dword [edi]			; autoc[0]+=d*data[sample]  ST = d	WATCHOUT: no displacement byte here!
-.jumper1_0:
-
-	fstp	st0				; pop d, ST = empty
-	add	esi, byte 4			; sample++
-	dec	ecx
-	jz	.loop1_end
-	fld	dword [esi]			; ST = d <- data[sample]
-	jmp	edx
-.loop1_end:
-
-	;	for(; sample < data_len; sample++) {
-	;		d = data[sample];
-	;		for(coeff = 0; coeff < data_len - sample; coeff++)
-	;			autoc[coeff] += d * data[sample+coeff];
-	;	}
-	mov	ecx, [esp + 24]			; ecx <- lag
-	dec	ecx				; ecx <- lag - 1
-	jz	near .end			; skip loop if 0 (i.e. lag == 1)
-
-	fld	dword [esi]			; ST = d <- data[sample]
-	mov	eax, ecx			; eax <- lag - 1 == data_len - sample the first time through
-	; each iteration is 11 bytes so we need (-eax)*11, so we do (-12*eax + eax)
-	lea	edx, [eax + eax*2]
-	neg	edx
-	lea	edx, [eax + edx*4 + .jumper2_0 - .get_eip2]
-	call	.get_eip2
-.get_eip2:
-	pop	ebx
-	add	edx, ebx
-	inc	edx				; compensate for the shorter opcode on the last iteration
-	inc	edx				; compensate for the shorter opcode on the last iteration
-	inc	edx				; compensate for the shorter opcode on the last iteration
-	jmp	edx
-
-	fld	st0				; ST = d d
-	fmul	dword [esi + (31*4)]		; ST = d*data[sample+31] d
-	fadd	dword [edi + (31*4)]		; ST = autoc[31]+d*data[sample+31] d
-	fstp	dword [edi + (31*4)]		; autoc[31]+=d*data[sample+31]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (30*4)]		; ST = d*data[sample+30] d
-	fadd	dword [edi + (30*4)]		; ST = autoc[30]+d*data[sample+30] d
-	fstp	dword [edi + (30*4)]		; autoc[30]+=d*data[sample+30]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (29*4)]		; ST = d*data[sample+29] d
-	fadd	dword [edi + (29*4)]		; ST = autoc[29]+d*data[sample+29] d
-	fstp	dword [edi + (29*4)]		; autoc[29]+=d*data[sample+29]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (28*4)]		; ST = d*data[sample+28] d
-	fadd	dword [edi + (28*4)]		; ST = autoc[28]+d*data[sample+28] d
-	fstp	dword [edi + (28*4)]		; autoc[28]+=d*data[sample+28]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (27*4)]		; ST = d*data[sample+27] d
-	fadd	dword [edi + (27*4)]		; ST = autoc[27]+d*data[sample+27] d
-	fstp	dword [edi + (27*4)]		; autoc[27]+=d*data[sample+27]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (26*4)]		; ST = d*data[sample+26] d
-	fadd	dword [edi + (26*4)]		; ST = autoc[26]+d*data[sample+26] d
-	fstp	dword [edi + (26*4)]		; autoc[26]+=d*data[sample+26]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (25*4)]		; ST = d*data[sample+25] d
-	fadd	dword [edi + (25*4)]		; ST = autoc[25]+d*data[sample+25] d
-	fstp	dword [edi + (25*4)]		; autoc[25]+=d*data[sample+25]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (24*4)]		; ST = d*data[sample+24] d
-	fadd	dword [edi + (24*4)]		; ST = autoc[24]+d*data[sample+24] d
-	fstp	dword [edi + (24*4)]		; autoc[24]+=d*data[sample+24]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (23*4)]		; ST = d*data[sample+23] d
-	fadd	dword [edi + (23*4)]		; ST = autoc[23]+d*data[sample+23] d
-	fstp	dword [edi + (23*4)]		; autoc[23]+=d*data[sample+23]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (22*4)]		; ST = d*data[sample+22] d
-	fadd	dword [edi + (22*4)]		; ST = autoc[22]+d*data[sample+22] d
-	fstp	dword [edi + (22*4)]		; autoc[22]+=d*data[sample+22]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (21*4)]		; ST = d*data[sample+21] d
-	fadd	dword [edi + (21*4)]		; ST = autoc[21]+d*data[sample+21] d
-	fstp	dword [edi + (21*4)]		; autoc[21]+=d*data[sample+21]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (20*4)]		; ST = d*data[sample+20] d
-	fadd	dword [edi + (20*4)]		; ST = autoc[20]+d*data[sample+20] d
-	fstp	dword [edi + (20*4)]		; autoc[20]+=d*data[sample+20]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (19*4)]		; ST = d*data[sample+19] d
-	fadd	dword [edi + (19*4)]		; ST = autoc[19]+d*data[sample+19] d
-	fstp	dword [edi + (19*4)]		; autoc[19]+=d*data[sample+19]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (18*4)]		; ST = d*data[sample+18] d
-	fadd	dword [edi + (18*4)]		; ST = autoc[18]+d*data[sample+18] d
-	fstp	dword [edi + (18*4)]		; autoc[18]+=d*data[sample+18]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (17*4)]		; ST = d*data[sample+17] d
-	fadd	dword [edi + (17*4)]		; ST = autoc[17]+d*data[sample+17] d
-	fstp	dword [edi + (17*4)]		; autoc[17]+=d*data[sample+17]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (16*4)]		; ST = d*data[sample+16] d
-	fadd	dword [edi + (16*4)]		; ST = autoc[16]+d*data[sample+16] d
-	fstp	dword [edi + (16*4)]		; autoc[16]+=d*data[sample+16]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (15*4)]		; ST = d*data[sample+15] d
-	fadd	dword [edi + (15*4)]		; ST = autoc[15]+d*data[sample+15] d
-	fstp	dword [edi + (15*4)]		; autoc[15]+=d*data[sample+15]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (14*4)]		; ST = d*data[sample+14] d
-	fadd	dword [edi + (14*4)]		; ST = autoc[14]+d*data[sample+14] d
-	fstp	dword [edi + (14*4)]		; autoc[14]+=d*data[sample+14]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (13*4)]		; ST = d*data[sample+13] d
-	fadd	dword [edi + (13*4)]		; ST = autoc[13]+d*data[sample+13] d
-	fstp	dword [edi + (13*4)]		; autoc[13]+=d*data[sample+13]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (12*4)]		; ST = d*data[sample+12] d
-	fadd	dword [edi + (12*4)]		; ST = autoc[12]+d*data[sample+12] d
-	fstp	dword [edi + (12*4)]		; autoc[12]+=d*data[sample+12]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (11*4)]		; ST = d*data[sample+11] d
-	fadd	dword [edi + (11*4)]		; ST = autoc[11]+d*data[sample+11] d
-	fstp	dword [edi + (11*4)]		; autoc[11]+=d*data[sample+11]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + (10*4)]		; ST = d*data[sample+10] d
-	fadd	dword [edi + (10*4)]		; ST = autoc[10]+d*data[sample+10] d
-	fstp	dword [edi + (10*4)]		; autoc[10]+=d*data[sample+10]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 9*4)]		; ST = d*data[sample+9] d
-	fadd	dword [edi + ( 9*4)]		; ST = autoc[9]+d*data[sample+9] d
-	fstp	dword [edi + ( 9*4)]		; autoc[9]+=d*data[sample+9]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 8*4)]		; ST = d*data[sample+8] d
-	fadd	dword [edi + ( 8*4)]		; ST = autoc[8]+d*data[sample+8] d
-	fstp	dword [edi + ( 8*4)]		; autoc[8]+=d*data[sample+8]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 7*4)]		; ST = d*data[sample+7] d
-	fadd	dword [edi + ( 7*4)]		; ST = autoc[7]+d*data[sample+7] d
-	fstp	dword [edi + ( 7*4)]		; autoc[7]+=d*data[sample+7]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 6*4)]		; ST = d*data[sample+6] d
-	fadd	dword [edi + ( 6*4)]		; ST = autoc[6]+d*data[sample+6] d
-	fstp	dword [edi + ( 6*4)]		; autoc[6]+=d*data[sample+6]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 5*4)]		; ST = d*data[sample+4] d
-	fadd	dword [edi + ( 5*4)]		; ST = autoc[4]+d*data[sample+4] d
-	fstp	dword [edi + ( 5*4)]		; autoc[4]+=d*data[sample+4]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 4*4)]		; ST = d*data[sample+4] d
-	fadd	dword [edi + ( 4*4)]		; ST = autoc[4]+d*data[sample+4] d
-	fstp	dword [edi + ( 4*4)]		; autoc[4]+=d*data[sample+4]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 3*4)]		; ST = d*data[sample+3] d
-	fadd	dword [edi + ( 3*4)]		; ST = autoc[3]+d*data[sample+3] d
-	fstp	dword [edi + ( 3*4)]		; autoc[3]+=d*data[sample+3]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 2*4)]		; ST = d*data[sample+2] d
-	fadd	dword [edi + ( 2*4)]		; ST = autoc[2]+d*data[sample+2] d
-	fstp	dword [edi + ( 2*4)]		; autoc[2]+=d*data[sample+2]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi + ( 1*4)]		; ST = d*data[sample+1] d
-	fadd	dword [edi + ( 1*4)]		; ST = autoc[1]+d*data[sample+1] d
-	fstp	dword [edi + ( 1*4)]		; autoc[1]+=d*data[sample+1]  ST = d
-	fld	st0				; ST = d d
-	fmul	dword [esi]			; ST = d*data[sample] d			WATCHOUT: no displacement byte here!
-	fadd	dword [edi]			; ST = autoc[0]+d*data[sample] d	WATCHOUT: no displacement byte here!
-	fstp	dword [edi]			; autoc[0]+=d*data[sample]  ST = d	WATCHOUT: no displacement byte here!
-.jumper2_0:
-
-	fstp	st0				; pop d, ST = empty
-	add	esi, byte 4			; sample++
-	dec	ecx
-	jz	.loop2_end
-	add	edx, byte 11			; adjust our inner loop counter by adjusting the jump target
-	fld	dword [esi]			; ST = d <- data[sample]
-	jmp	edx
-.loop2_end:
-
-.end:
-	pop	ebx
-	pop	edi
-	pop	esi
-	ret
-
-	ALIGN 16
-cident FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4
-	;[esp + 16] == autoc[]
-	;[esp + 12] == lag
-	;[esp + 8] == data_len
-	;[esp + 4] == data[]
-
-	;ASSERT(lag > 0)
-	;ASSERT(lag <= 4)
-	;ASSERT(lag <= data_len)
-
-	;	for(coeff = 0; coeff < lag; coeff++)
-	;		autoc[coeff] = 0.0;
-	xorps	xmm5, xmm5
-
-	mov	edx, [esp + 8]			; edx == data_len
-	mov	eax, [esp + 4]			; eax == &data[sample] <- &data[0]
-
-	movss	xmm0, [eax]			; xmm0 = 0,0,0,data[0]
-	add	eax, 4
-	movaps	xmm2, xmm0			; xmm2 = 0,0,0,data[0]
-	shufps	xmm0, xmm0, 0			; xmm0 == data[sample],data[sample],data[sample],data[sample] = data[0],data[0],data[0],data[0]
-.warmup:					; xmm2 == data[sample-3],data[sample-2],data[sample-1],data[sample]
-	mulps	xmm0, xmm2			; xmm0 = xmm0 * xmm2
-	addps	xmm5, xmm0			; xmm5 += xmm0 * xmm2
-	dec	edx
-	jz	.loop_end
-	ALIGN 16
-.loop_start:
-	; start by reading the next sample
-	movss	xmm0, [eax]			; xmm0 = 0,0,0,data[sample]
-	add	eax, 4
-	shufps	xmm0, xmm0, 0			; xmm0 = data[sample],data[sample],data[sample],data[sample]
-	shufps	xmm2, xmm2, 93h			; 93h=2-1-0-3 => xmm2 gets rotated left by one float
-	movss	xmm2, xmm0
-	mulps	xmm0, xmm2			; xmm0 = xmm0 * xmm2
-	addps	xmm5, xmm0			; xmm5 += xmm0 * xmm2
-	dec	edx
-	jnz	.loop_start
-.loop_end:
-	; store autoc
-	mov	edx, [esp + 16]			; edx == autoc
-	movups	[edx], xmm5
-
-.end:
-	ret
-
-	ALIGN 16
-cident FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8
-	;[esp + 16] == autoc[]
-	;[esp + 12] == lag
-	;[esp + 8] == data_len
-	;[esp + 4] == data[]
-
-	;ASSERT(lag > 0)
-	;ASSERT(lag <= 8)
-	;ASSERT(lag <= data_len)
-
-	;	for(coeff = 0; coeff < lag; coeff++)
-	;		autoc[coeff] = 0.0;
-	xorps	xmm5, xmm5
-	xorps	xmm6, xmm6
-
-	mov	edx, [esp + 8]			; edx == data_len
-	mov	eax, [esp + 4]			; eax == &data[sample] <- &data[0]
-
-	movss	xmm0, [eax]			; xmm0 = 0,0,0,data[0]
-	add	eax, 4
-	movaps	xmm2, xmm0			; xmm2 = 0,0,0,data[0]
-	shufps	xmm0, xmm0, 0			; xmm0 == data[sample],data[sample],data[sample],data[sample] = data[0],data[0],data[0],data[0]
-	movaps	xmm1, xmm0			; xmm1 == data[sample],data[sample],data[sample],data[sample] = data[0],data[0],data[0],data[0]
-	xorps	xmm3, xmm3			; xmm3 = 0,0,0,0
-.warmup:					; xmm3:xmm2 == data[sample-7],data[sample-6],...,data[sample]
-	mulps	xmm0, xmm2
-	mulps	xmm1, xmm3			; xmm1:xmm0 = xmm1:xmm0 * xmm3:xmm2
-	addps	xmm5, xmm0
-	addps	xmm6, xmm1			; xmm6:xmm5 += xmm1:xmm0 * xmm3:xmm2
-	dec	edx
-	jz	.loop_end
-	ALIGN 16
-.loop_start:
-	; start by reading the next sample
-	movss	xmm0, [eax]			; xmm0 = 0,0,0,data[sample]
-	; here we reorder the instructions; see the (#) indexes for a logical order
-	shufps	xmm2, xmm2, 93h			; (3) 93h=2-1-0-3 => xmm2 gets rotated left by one float
-	add	eax, 4				; (0)
-	shufps	xmm3, xmm3, 93h			; (4) 93h=2-1-0-3 => xmm3 gets rotated left by one float
-	shufps	xmm0, xmm0, 0			; (1) xmm0 = data[sample],data[sample],data[sample],data[sample]
-	movss	xmm3, xmm2			; (5)
-	movaps	xmm1, xmm0			; (2) xmm1 = data[sample],data[sample],data[sample],data[sample]
-	movss	xmm2, xmm0			; (6)
-	mulps	xmm1, xmm3			; (8)
-	mulps	xmm0, xmm2			; (7) xmm1:xmm0 = xmm1:xmm0 * xmm3:xmm2
-	addps	xmm6, xmm1			; (10)
-	addps	xmm5, xmm0			; (9) xmm6:xmm5 += xmm1:xmm0 * xmm3:xmm2
-	dec	edx
-	jnz	.loop_start
-.loop_end:
-	; store autoc
-	mov	edx, [esp + 16]			; edx == autoc
-	movups	[edx], xmm5
-	movups	[edx + 16], xmm6
-
-.end:
-	ret
-
-	ALIGN 16
-cident FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12
-	;[esp + 16] == autoc[]
-	;[esp + 12] == lag
-	;[esp + 8] == data_len
-	;[esp + 4] == data[]
-
-	;ASSERT(lag > 0)
-	;ASSERT(lag <= 12)
-	;ASSERT(lag <= data_len)
-
-	;	for(coeff = 0; coeff < lag; coeff++)
-	;		autoc[coeff] = 0.0;
-	xorps	xmm5, xmm5
-	xorps	xmm6, xmm6
-	xorps	xmm7, xmm7
-
-	mov	edx, [esp + 8]			; edx == data_len
-	mov	eax, [esp + 4]			; eax == &data[sample] <- &data[0]
-
-	movss	xmm0, [eax]			; xmm0 = 0,0,0,data[0]
-	add	eax, 4
-	movaps	xmm2, xmm0			; xmm2 = 0,0,0,data[0]
-	shufps	xmm0, xmm0, 0			; xmm0 == data[sample],data[sample],data[sample],data[sample] = data[0],data[0],data[0],data[0]
-	xorps	xmm3, xmm3			; xmm3 = 0,0,0,0
-	xorps	xmm4, xmm4			; xmm4 = 0,0,0,0
-.warmup:					; xmm3:xmm2 == data[sample-7],data[sample-6],...,data[sample]
-	movaps	xmm1, xmm0
-	mulps	xmm1, xmm2
-	addps	xmm5, xmm1
-	movaps	xmm1, xmm0
-	mulps	xmm1, xmm3
-	addps	xmm6, xmm1
-	mulps	xmm0, xmm4
-	addps	xmm7, xmm0			; xmm7:xmm6:xmm5 += xmm0:xmm0:xmm0 * xmm4:xmm3:xmm2
-	dec	edx
-	jz	.loop_end
-	ALIGN 16
-.loop_start:
-	; start by reading the next sample
-	movss	xmm0, [eax]			; xmm0 = 0,0,0,data[sample]
-	add	eax, 4
-	shufps	xmm0, xmm0, 0			; xmm0 = data[sample],data[sample],data[sample],data[sample]
-
-	; shift xmm4:xmm3:xmm2 left by one float
-	shufps	xmm2, xmm2, 93h			; 93h=2-1-0-3 => xmm2 gets rotated left by one float
-	shufps	xmm3, xmm3, 93h			; 93h=2-1-0-3 => xmm3 gets rotated left by one float
-	shufps	xmm4, xmm4, 93h			; 93h=2-1-0-3 => xmm4 gets rotated left by one float
-	movss	xmm4, xmm3
-	movss	xmm3, xmm2
-	movss	xmm2, xmm0
-
-	; xmm7:xmm6:xmm5 += xmm0:xmm0:xmm0 * xmm3:xmm3:xmm2
-	movaps	xmm1, xmm0
-	mulps	xmm1, xmm2
-	addps	xmm5, xmm1
-	movaps	xmm1, xmm0
-	mulps	xmm1, xmm3
-	addps	xmm6, xmm1
-	mulps	xmm0, xmm4
-	addps	xmm7, xmm0
-
-	dec	edx
-	jnz	.loop_start
-.loop_end:
-	; store autoc
-	mov	edx, [esp + 16]			; edx == autoc
-	movups	[edx], xmm5
-	movups	[edx + 16], xmm6
-	movups	[edx + 32], xmm7
-
-.end:
-	ret
-
-	ALIGN 16
-cident FLAC__lpc_compute_autocorrelation_asm_ia32_3dnow
-	;[ebp + 32] autoc
-	;[ebp + 28] lag
-	;[ebp + 24] data_len
-	;[ebp + 20] data
-
-	push	ebp
-	push	ebx
-	push	esi
-	push	edi
-	mov	ebp, esp
-
-	mov	esi, [ebp + 20]
-	mov	edi, [ebp + 24]
-	mov	edx, [ebp + 28]
-	inc	edx
-	and	edx, byte -2
-	mov	eax, edx
-	neg	eax
-	and	esp, byte -8
-	lea	esp, [esp + 4 * eax]
-	mov	ecx, edx
-	xor	eax, eax
-.loop0:
-	dec	ecx
-	mov	[esp + 4 * ecx], eax
-	jnz	short .loop0
-
-	mov	eax, edi
-	sub	eax, edx
-	mov	ebx, edx
-	and	ebx, byte 1
-	sub	eax, ebx
-	lea	ecx, [esi + 4 * eax - 12]
-	cmp	esi, ecx
-	mov	eax, esi
-	ja	short .loop2_pre
-	ALIGN	16		;4 nops
-.loop1_i:
-	movd	mm0, [eax]
-	movd	mm2, [eax + 4]
-	movd	mm4, [eax + 8]
-	movd	mm6, [eax + 12]
-	mov	ebx, edx
-	punpckldq	mm0, mm0
-	punpckldq	mm2, mm2
-	punpckldq	mm4, mm4
-	punpckldq	mm6, mm6
-	ALIGN	16		;3 nops
-.loop1_j:
-	sub	ebx, byte 2
-	movd	mm1, [eax + 4 * ebx]
-	movd	mm3, [eax + 4 * ebx + 4]
-	movd	mm5, [eax + 4 * ebx + 8]
-	movd	mm7, [eax + 4 * ebx + 12]
-	punpckldq	mm1, mm3
-	punpckldq	mm3, mm5
-	pfmul	mm1, mm0
-	punpckldq	mm5, mm7
-	pfmul	mm3, mm2
-	punpckldq	mm7, [eax + 4 * ebx + 16]
-	pfmul	mm5, mm4
-	pfmul	mm7, mm6
-	pfadd	mm1, mm3
-	movq	mm3, [esp + 4 * ebx]
-	pfadd	mm5, mm7
-	pfadd	mm1, mm5
-	pfadd	mm3, mm1
-	movq	[esp + 4 * ebx], mm3
-	jg	short .loop1_j
-
-	add	eax, byte 16
-	cmp	eax, ecx
-	jb	short .loop1_i
-
-.loop2_pre:
-	mov	ebx, eax
-	sub	eax, esi
-	shr	eax, 2
-	lea	ecx, [esi + 4 * edi]
-	mov	esi, ebx
-.loop2_i:
-	movd	mm0, [esi]
-	mov	ebx, edi
-	sub	ebx, eax
-	cmp	ebx, edx
-	jbe	short .loop2_j
-	mov	ebx, edx
-.loop2_j:
-	dec	ebx
-	movd	mm1, [esi + 4 * ebx]
-	pfmul	mm1, mm0
-	movd	mm2, [esp + 4 * ebx]
-	pfadd	mm1, mm2
-	movd	[esp + 4 * ebx], mm1
-
-	jnz	short .loop2_j
-
-	add	esi, byte 4
-	inc	eax
-	cmp	esi, ecx
-	jnz	short .loop2_i
-
-	mov	edi, [ebp + 32]
-	mov	edx, [ebp + 28]
-.loop3:
-	dec	edx
-	mov	eax, [esp + 4 * edx]
-	mov	[edi + 4 * edx], eax
-	jnz	short .loop3
-
-	femms
-
-	mov	esp, ebp
-	pop	edi
-	pop	esi
-	pop	ebx
-	pop	ebp
-	ret
-
-;void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[])
-;
-;	for(i = 0; i < data_len; i++) {
-;		sum = 0;
-;		for(j = 0; j < order; j++)
-;			sum += qlp_coeff[j] * data[i-j-1];
-;		residual[i] = data[i] - (sum >> lp_quantization);
-;	}
-;
-	ALIGN	16
-cident FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32
-	;[esp + 40]	residual[]
-	;[esp + 36]	lp_quantization
-	;[esp + 32]	order
-	;[esp + 28]	qlp_coeff[]
-	;[esp + 24]	data_len
-	;[esp + 20]	data[]
-
-	;ASSERT(order > 0)
-
-	push	ebp
-	push	ebx
-	push	esi
-	push	edi
-
-	mov	esi, [esp + 20]			; esi = data[]
-	mov	edi, [esp + 40]			; edi = residual[]
-	mov	eax, [esp + 32]			; eax = order
-	mov	ebx, [esp + 24]			; ebx = data_len
-
-	test	ebx, ebx
-	jz	near .end			; do nothing if data_len == 0
-.begin:
-	cmp	eax, byte 1
-	jg	short .i_1more
-
-	mov	ecx, [esp + 28]
-	mov	edx, [ecx]			; edx = qlp_coeff[0]
-	mov	eax, [esi - 4]			; eax = data[-1]
-	mov	cl, [esp + 36]			; cl = lp_quantization
-	ALIGN	16
-.i_1_loop_i:
-	imul	eax, edx
-	sar	eax, cl
-	neg	eax
-	add	eax, [esi]
-	mov	[edi], eax
-	mov	eax, [esi]
-	add	edi, byte 4
-	add	esi, byte 4
-	dec	ebx
-	jnz	.i_1_loop_i
-
-	jmp	.end
-
-.i_1more:
-	cmp	eax, byte 32			; for order <= 32 there is a faster routine
-	jbe	short .i_32
-
-	; This version is here just for completeness, since FLAC__MAX_LPC_ORDER == 32
-	ALIGN 16
-.i_32more_loop_i:
-	xor	ebp, ebp
-	mov	ecx, [esp + 32]
-	mov	edx, ecx
-	shl	edx, 2
-	add	edx, [esp + 28]
-	neg	ecx
-	ALIGN	16
-.i_32more_loop_j:
-	sub	edx, byte 4
-	mov	eax, [edx]
-	imul	eax, [esi + 4 * ecx]
-	add	ebp, eax
-	inc	ecx
-	jnz	short .i_32more_loop_j
-
-	mov	cl, [esp + 36]
-	sar	ebp, cl
-	neg	ebp
-	add	ebp, [esi]
-	mov	[edi], ebp
-	add	esi, byte 4
-	add	edi, byte 4
-
-	dec	ebx
-	jnz	.i_32more_loop_i
-
-	jmp	.end
-
-.i_32:
-	sub	edi, esi
-	neg	eax
-	lea	edx, [eax + eax * 8 + .jumper_0 - .get_eip0]
-	call	.get_eip0
-.get_eip0:
-	pop	eax
-	add	edx, eax
-	inc	edx
-	mov	eax, [esp + 28]			; eax = qlp_coeff[]
-	xor	ebp, ebp
-	jmp	edx
-
-	mov	ecx, [eax + 124]
-	imul	ecx, [esi - 128]
-	add	ebp, ecx
-	mov	ecx, [eax + 120]
-	imul	ecx, [esi - 124]
-	add	ebp, ecx
-	mov	ecx, [eax + 116]
-	imul	ecx, [esi - 120]
-	add	ebp, ecx
-	mov	ecx, [eax + 112]
-	imul	ecx, [esi - 116]
-	add	ebp, ecx
-	mov	ecx, [eax + 108]
-	imul	ecx, [esi - 112]
-	add	ebp, ecx
-	mov	ecx, [eax + 104]
-	imul	ecx, [esi - 108]
-	add	ebp, ecx
-	mov	ecx, [eax + 100]
-	imul	ecx, [esi - 104]
-	add	ebp, ecx
-	mov	ecx, [eax + 96]
-	imul	ecx, [esi - 100]
-	add	ebp, ecx
-	mov	ecx, [eax + 92]
-	imul	ecx, [esi - 96]
-	add	ebp, ecx
-	mov	ecx, [eax + 88]
-	imul	ecx, [esi - 92]
-	add	ebp, ecx
-	mov	ecx, [eax + 84]
-	imul	ecx, [esi - 88]
-	add	ebp, ecx
-	mov	ecx, [eax + 80]
-	imul	ecx, [esi - 84]
-	add	ebp, ecx
-	mov	ecx, [eax + 76]
-	imul	ecx, [esi - 80]
-	add	ebp, ecx
-	mov	ecx, [eax + 72]
-	imul	ecx, [esi - 76]
-	add	ebp, ecx
-	mov	ecx, [eax + 68]
-	imul	ecx, [esi - 72]
-	add	ebp, ecx
-	mov	ecx, [eax + 64]
-	imul	ecx, [esi - 68]
-	add	ebp, ecx
-	mov	ecx, [eax + 60]
-	imul	ecx, [esi - 64]
-	add	ebp, ecx
-	mov	ecx, [eax + 56]
-	imul	ecx, [esi - 60]
-	add	ebp, ecx
-	mov	ecx, [eax + 52]
-	imul	ecx, [esi - 56]
-	add	ebp, ecx
-	mov	ecx, [eax + 48]
-	imul	ecx, [esi - 52]
-	add	ebp, ecx
-	mov	ecx, [eax + 44]
-	imul	ecx, [esi - 48]
-	add	ebp, ecx
-	mov	ecx, [eax + 40]
-	imul	ecx, [esi - 44]
-	add	ebp, ecx
-	mov	ecx, [eax + 36]
-	imul	ecx, [esi - 40]
-	add	ebp, ecx
-	mov	ecx, [eax + 32]
-	imul	ecx, [esi - 36]
-	add	ebp, ecx
-	mov	ecx, [eax + 28]
-	imul	ecx, [esi - 32]
-	add	ebp, ecx
-	mov	ecx, [eax + 24]
-	imul	ecx, [esi - 28]
-	add	ebp, ecx
-	mov	ecx, [eax + 20]
-	imul	ecx, [esi - 24]
-	add	ebp, ecx
-	mov	ecx, [eax + 16]
-	imul	ecx, [esi - 20]
-	add	ebp, ecx
-	mov	ecx, [eax + 12]
-	imul	ecx, [esi - 16]
-	add	ebp, ecx
-	mov	ecx, [eax + 8]
-	imul	ecx, [esi - 12]
-	add	ebp, ecx
-	mov	ecx, [eax + 4]
-	imul	ecx, [esi - 8]
-	add	ebp, ecx
-	mov	ecx, [eax]			; there is one byte missing
-	imul	ecx, [esi - 4]
-	add	ebp, ecx
-.jumper_0:
-
-	mov	cl, [esp + 36]
-	sar	ebp, cl
-	neg	ebp
-	add	ebp, [esi]
-	mov	[edi + esi], ebp
-	add	esi, byte 4
-
-	dec	ebx
-	jz	short .end
-	xor	ebp, ebp
-	jmp	edx
-
-.end:
-	pop	edi
-	pop	esi
-	pop	ebx
-	pop	ebp
-	ret
-
-; WATCHOUT: this routine works on 16 bit data which means bits-per-sample for
-; the channel and qlp_coeffs must be <= 16.  Especially note that this routine
-; cannot be used for side-channel coded 16bps channels since the effective bps
-; is 17.
-	ALIGN	16
-cident FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx
-	;[esp + 40]	residual[]
-	;[esp + 36]	lp_quantization
-	;[esp + 32]	order
-	;[esp + 28]	qlp_coeff[]
-	;[esp + 24]	data_len
-	;[esp + 20]	data[]
-
-	;ASSERT(order > 0)
-
-	push	ebp
-	push	ebx
-	push	esi
-	push	edi
-
-	mov	esi, [esp + 20]			; esi = data[]
-	mov	edi, [esp + 40]			; edi = residual[]
-	mov	eax, [esp + 32]			; eax = order
-	mov	ebx, [esp + 24]			; ebx = data_len
-
-	test	ebx, ebx
-	jz	near .end			; do nothing if data_len == 0
-	dec	ebx
-	test	ebx, ebx
-	jz	near .last_one
-
-	mov	edx, [esp + 28]			; edx = qlp_coeff[]
-	movd	mm6, [esp + 36]			; mm6 = 0:lp_quantization
-	mov	ebp, esp
-
-	and	esp, 0xfffffff8
-
-	xor	ecx, ecx
-.copy_qlp_loop:
-	push	word [edx + 4 * ecx]
-	inc	ecx
-	cmp	ecx, eax
-	jnz	short .copy_qlp_loop
-
-	and	ecx, 0x3
-	test	ecx, ecx
-	je	short .za_end
-	sub	ecx, byte 4
-.za_loop:
-	push	word 0
-	inc	eax
-	inc	ecx
-	jnz	short .za_loop
-.za_end:
-
-	movq	mm5, [esp + 2 * eax - 8]
-	movd	mm4, [esi - 16]
-	punpckldq	mm4, [esi - 12]
-	movd	mm0, [esi - 8]
-	punpckldq	mm0, [esi - 4]
-	packssdw	mm4, mm0
-
-	cmp	eax, byte 4
-	jnbe	short .mmx_4more
-
-	ALIGN	16
-.mmx_4_loop_i:
-	movd	mm1, [esi]
-	movq	mm3, mm4
-	punpckldq	mm1, [esi + 4]
-	psrlq	mm4, 16
-	movq	mm0, mm1
-	psllq	mm0, 48
-	por	mm4, mm0
-	movq	mm2, mm4
-	psrlq	mm4, 16
-	pxor	mm0, mm0
-	punpckhdq	mm0, mm1
-	pmaddwd	mm3, mm5
-	pmaddwd	mm2, mm5
-	psllq	mm0, 16
-	por	mm4, mm0
-	movq	mm0, mm3
-	punpckldq	mm3, mm2
-	punpckhdq	mm0, mm2
-	paddd	mm3, mm0
-	psrad	mm3, mm6
-	psubd	mm1, mm3
-	movd	[edi], mm1
-	punpckhdq	mm1, mm1
-	movd	[edi + 4], mm1
-
-	add	edi, byte 8
-	add	esi, byte 8
-
-	sub	ebx, 2
-	jg	.mmx_4_loop_i
-	jmp	.mmx_end
-
-.mmx_4more:
-	shl	eax, 2
-	neg	eax
-	add	eax, byte 16
-
-	ALIGN	16
-.mmx_4more_loop_i:
-	movd	mm1, [esi]
-	punpckldq	mm1, [esi + 4]
-	movq	mm3, mm4
-	psrlq	mm4, 16
-	movq	mm0, mm1
-	psllq	mm0, 48
-	por	mm4, mm0
-	movq	mm2, mm4
-	psrlq	mm4, 16
-	pxor	mm0, mm0
-	punpckhdq	mm0, mm1
-	pmaddwd	mm3, mm5
-	pmaddwd	mm2, mm5
-	psllq	mm0, 16
-	por	mm4, mm0
-
-	mov	ecx, esi
-	add	ecx, eax
-	mov	edx, esp
-
-	ALIGN	16
-.mmx_4more_loop_j:
-	movd	mm0, [ecx - 16]
-	movd	mm7, [ecx - 8]
-	punpckldq	mm0, [ecx - 12]
-	punpckldq	mm7, [ecx - 4]
-	packssdw	mm0, mm7
-	pmaddwd	mm0, [edx]
-	punpckhdq	mm7, mm7
-	paddd	mm3, mm0
-	movd	mm0, [ecx - 12]
-	punpckldq	mm0, [ecx - 8]
-	punpckldq	mm7, [ecx]
-	packssdw	mm0, mm7
-	pmaddwd	mm0, [edx]
-	paddd	mm2, mm0
-
-	add	edx, byte 8
-	add	ecx, byte 16
-	cmp	ecx, esi
-	jnz	.mmx_4more_loop_j
-
-	movq	mm0, mm3
-	punpckldq	mm3, mm2
-	punpckhdq	mm0, mm2
-	paddd	mm3, mm0
-	psrad	mm3, mm6
-	psubd	mm1, mm3
-	movd	[edi], mm1
-	punpckhdq	mm1, mm1
-	movd	[edi + 4], mm1
-
-	add	edi, byte 8
-	add	esi, byte 8
-
-	sub	ebx, 2
-	jg	near .mmx_4more_loop_i
-
-.mmx_end:
-	emms
-	mov	esp, ebp
-.last_one:
-	mov	eax, [esp + 32]
-	inc	ebx
-	jnz	near FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32.begin
-
-.end:
-	pop	edi
-	pop	esi
-	pop	ebx
-	pop	ebp
-	ret
-
-; **********************************************************************
-;
-; void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[])
-; {
-; 	unsigned i, j;
-; 	FLAC__int32 sum;
-;
-; 	FLAC__ASSERT(order > 0);
-;
-; 	for(i = 0; i < data_len; i++) {
-; 		sum = 0;
-; 		for(j = 0; j < order; j++)
-; 			sum += qlp_coeff[j] * data[i-j-1];
-; 		data[i] = residual[i] + (sum >> lp_quantization);
-; 	}
-; }
-	ALIGN	16
-cident FLAC__lpc_restore_signal_asm_ia32
-	;[esp + 40]	data[]
-	;[esp + 36]	lp_quantization
-	;[esp + 32]	order
-	;[esp + 28]	qlp_coeff[]
-	;[esp + 24]	data_len
-	;[esp + 20]	residual[]
-
-	;ASSERT(order > 0)
-
-	push	ebp
-	push	ebx
-	push	esi
-	push	edi
-
-	mov	esi, [esp + 20]			; esi = residual[]
-	mov	edi, [esp + 40]			; edi = data[]
-	mov	eax, [esp + 32]			; eax = order
-	mov	ebx, [esp + 24]			; ebx = data_len
-
-	test	ebx, ebx
-	jz	near .end			; do nothing if data_len == 0
-
-.begin:
-	cmp	eax, byte 1
-	jg	short .x87_1more
-
-	mov	ecx, [esp + 28]
-	mov	edx, [ecx]
-	mov	eax, [edi - 4]
-	mov	cl, [esp + 36]
-	ALIGN	16
-.x87_1_loop_i:
-	imul	eax, edx
-	sar	eax, cl
-	add	eax, [esi]
-	mov	[edi], eax
-	add	esi, byte 4
-	add	edi, byte 4
-	dec	ebx
-	jnz	.x87_1_loop_i
-
-	jmp	.end
-
-.x87_1more:
-	cmp	eax, byte 32			; for order <= 32 there is a faster routine
-	jbe	short .x87_32
-
-	; This version is here just for completeness, since FLAC__MAX_LPC_ORDER == 32
-	ALIGN 16
-.x87_32more_loop_i:
-	xor	ebp, ebp
-	mov	ecx, [esp + 32]
-	mov	edx, ecx
-	shl	edx, 2
-	add	edx, [esp + 28]
-	neg	ecx
-	ALIGN	16
-.x87_32more_loop_j:
-	sub	edx, byte 4
-	mov	eax, [edx]
-	imul	eax, [edi + 4 * ecx]
-	add	ebp, eax
-	inc	ecx
-	jnz	short .x87_32more_loop_j
-
-	mov	cl, [esp + 36]
-	sar	ebp, cl
-	add	ebp, [esi]
-	mov	[edi], ebp
-	add	edi, byte 4
-	add	esi, byte 4
-
-	dec	ebx
-	jnz	.x87_32more_loop_i
-
-	jmp	.end
-
-.x87_32:
-	sub	esi, edi
-	neg	eax
-	lea	edx, [eax + eax * 8 + .jumper_0 - .get_eip0]
-	call	.get_eip0
-.get_eip0:
-	pop	eax
-	add	edx, eax
-	inc	edx				; compensate for the shorter opcode on the last iteration
-	mov	eax, [esp + 28]			; eax = qlp_coeff[]
-	xor	ebp, ebp
-	jmp	edx
-
-	mov	ecx, [eax + 124]		; ecx =  qlp_coeff[31]
-	imul	ecx, [edi - 128]		; ecx =  qlp_coeff[31] * data[i-32]
-	add	ebp, ecx			; sum += qlp_coeff[31] * data[i-32]
-	mov	ecx, [eax + 120]		; ecx =  qlp_coeff[30]
-	imul	ecx, [edi - 124]		; ecx =  qlp_coeff[30] * data[i-31]
-	add	ebp, ecx			; sum += qlp_coeff[30] * data[i-31]
-	mov	ecx, [eax + 116]		; ecx =  qlp_coeff[29]
-	imul	ecx, [edi - 120]		; ecx =  qlp_coeff[29] * data[i-30]
-	add	ebp, ecx			; sum += qlp_coeff[29] * data[i-30]
-	mov	ecx, [eax + 112]		; ecx =  qlp_coeff[28]
-	imul	ecx, [edi - 116]		; ecx =  qlp_coeff[28] * data[i-29]
-	add	ebp, ecx			; sum += qlp_coeff[28] * data[i-29]
-	mov	ecx, [eax + 108]		; ecx =  qlp_coeff[27]
-	imul	ecx, [edi - 112]		; ecx =  qlp_coeff[27] * data[i-28]
-	add	ebp, ecx			; sum += qlp_coeff[27] * data[i-28]
-	mov	ecx, [eax + 104]		; ecx =  qlp_coeff[26]
-	imul	ecx, [edi - 108]		; ecx =  qlp_coeff[26] * data[i-27]
-	add	ebp, ecx			; sum += qlp_coeff[26] * data[i-27]
-	mov	ecx, [eax + 100]		; ecx =  qlp_coeff[25]
-	imul	ecx, [edi - 104]		; ecx =  qlp_coeff[25] * data[i-26]
-	add	ebp, ecx			; sum += qlp_coeff[25] * data[i-26]
-	mov	ecx, [eax + 96]			; ecx =  qlp_coeff[24]
-	imul	ecx, [edi - 100]		; ecx =  qlp_coeff[24] * data[i-25]
-	add	ebp, ecx			; sum += qlp_coeff[24] * data[i-25]
-	mov	ecx, [eax + 92]			; ecx =  qlp_coeff[23]
-	imul	ecx, [edi - 96]			; ecx =  qlp_coeff[23] * data[i-24]
-	add	ebp, ecx			; sum += qlp_coeff[23] * data[i-24]
-	mov	ecx, [eax + 88]			; ecx =  qlp_coeff[22]
-	imul	ecx, [edi - 92]			; ecx =  qlp_coeff[22] * data[i-23]
-	add	ebp, ecx			; sum += qlp_coeff[22] * data[i-23]
-	mov	ecx, [eax + 84]			; ecx =  qlp_coeff[21]
-	imul	ecx, [edi - 88]			; ecx =  qlp_coeff[21] * data[i-22]
-	add	ebp, ecx			; sum += qlp_coeff[21] * data[i-22]
-	mov	ecx, [eax + 80]			; ecx =  qlp_coeff[20]
-	imul	ecx, [edi - 84]			; ecx =  qlp_coeff[20] * data[i-21]
-	add	ebp, ecx			; sum += qlp_coeff[20] * data[i-21]
-	mov	ecx, [eax + 76]			; ecx =  qlp_coeff[19]
-	imul	ecx, [edi - 80]			; ecx =  qlp_coeff[19] * data[i-20]
-	add	ebp, ecx			; sum += qlp_coeff[19] * data[i-20]
-	mov	ecx, [eax + 72]			; ecx =  qlp_coeff[18]
-	imul	ecx, [edi - 76]			; ecx =  qlp_coeff[18] * data[i-19]
-	add	ebp, ecx			; sum += qlp_coeff[18] * data[i-19]
-	mov	ecx, [eax + 68]			; ecx =  qlp_coeff[17]
-	imul	ecx, [edi - 72]			; ecx =  qlp_coeff[17] * data[i-18]
-	add	ebp, ecx			; sum += qlp_coeff[17] * data[i-18]
-	mov	ecx, [eax + 64]			; ecx =  qlp_coeff[16]
-	imul	ecx, [edi - 68]			; ecx =  qlp_coeff[16] * data[i-17]
-	add	ebp, ecx			; sum += qlp_coeff[16] * data[i-17]
-	mov	ecx, [eax + 60]			; ecx =  qlp_coeff[15]
-	imul	ecx, [edi - 64]			; ecx =  qlp_coeff[15] * data[i-16]
-	add	ebp, ecx			; sum += qlp_coeff[15] * data[i-16]
-	mov	ecx, [eax + 56]			; ecx =  qlp_coeff[14]
-	imul	ecx, [edi - 60]			; ecx =  qlp_coeff[14] * data[i-15]
-	add	ebp, ecx			; sum += qlp_coeff[14] * data[i-15]
-	mov	ecx, [eax + 52]			; ecx =  qlp_coeff[13]
-	imul	ecx, [edi - 56]			; ecx =  qlp_coeff[13] * data[i-14]
-	add	ebp, ecx			; sum += qlp_coeff[13] * data[i-14]
-	mov	ecx, [eax + 48]			; ecx =  qlp_coeff[12]
-	imul	ecx, [edi - 52]			; ecx =  qlp_coeff[12] * data[i-13]
-	add	ebp, ecx			; sum += qlp_coeff[12] * data[i-13]
-	mov	ecx, [eax + 44]			; ecx =  qlp_coeff[11]
-	imul	ecx, [edi - 48]			; ecx =  qlp_coeff[11] * data[i-12]
-	add	ebp, ecx			; sum += qlp_coeff[11] * data[i-12]
-	mov	ecx, [eax + 40]			; ecx =  qlp_coeff[10]
-	imul	ecx, [edi - 44]			; ecx =  qlp_coeff[10] * data[i-11]
-	add	ebp, ecx			; sum += qlp_coeff[10] * data[i-11]
-	mov	ecx, [eax + 36]			; ecx =  qlp_coeff[ 9]
-	imul	ecx, [edi - 40]			; ecx =  qlp_coeff[ 9] * data[i-10]
-	add	ebp, ecx			; sum += qlp_coeff[ 9] * data[i-10]
-	mov	ecx, [eax + 32]			; ecx =  qlp_coeff[ 8]
-	imul	ecx, [edi - 36]			; ecx =  qlp_coeff[ 8] * data[i- 9]
-	add	ebp, ecx			; sum += qlp_coeff[ 8] * data[i- 9]
-	mov	ecx, [eax + 28]			; ecx =  qlp_coeff[ 7]
-	imul	ecx, [edi - 32]			; ecx =  qlp_coeff[ 7] * data[i- 8]
-	add	ebp, ecx			; sum += qlp_coeff[ 7] * data[i- 8]
-	mov	ecx, [eax + 24]			; ecx =  qlp_coeff[ 6]
-	imul	ecx, [edi - 28]			; ecx =  qlp_coeff[ 6] * data[i- 7]
-	add	ebp, ecx			; sum += qlp_coeff[ 6] * data[i- 7]
-	mov	ecx, [eax + 20]			; ecx =  qlp_coeff[ 5]
-	imul	ecx, [edi - 24]			; ecx =  qlp_coeff[ 5] * data[i- 6]
-	add	ebp, ecx			; sum += qlp_coeff[ 5] * data[i- 6]
-	mov	ecx, [eax + 16]			; ecx =  qlp_coeff[ 4]
-	imul	ecx, [edi - 20]			; ecx =  qlp_coeff[ 4] * data[i- 5]
-	add	ebp, ecx			; sum += qlp_coeff[ 4] * data[i- 5]
-	mov	ecx, [eax + 12]			; ecx =  qlp_coeff[ 3]
-	imul	ecx, [edi - 16]			; ecx =  qlp_coeff[ 3] * data[i- 4]
-	add	ebp, ecx			; sum += qlp_coeff[ 3] * data[i- 4]
-	mov	ecx, [eax + 8]			; ecx =  qlp_coeff[ 2]
-	imul	ecx, [edi - 12]			; ecx =  qlp_coeff[ 2] * data[i- 3]
-	add	ebp, ecx			; sum += qlp_coeff[ 2] * data[i- 3]
-	mov	ecx, [eax + 4]			; ecx =  qlp_coeff[ 1]
-	imul	ecx, [edi - 8]			; ecx =  qlp_coeff[ 1] * data[i- 2]
-	add	ebp, ecx			; sum += qlp_coeff[ 1] * data[i- 2]
-	mov	ecx, [eax]			; ecx =  qlp_coeff[ 0] (NOTE: one byte missing from instruction)
-	imul	ecx, [edi - 4]			; ecx =  qlp_coeff[ 0] * data[i- 1]
-	add	ebp, ecx			; sum += qlp_coeff[ 0] * data[i- 1]
-.jumper_0:
-
-	mov	cl, [esp + 36]
-	sar	ebp, cl				; ebp = (sum >> lp_quantization)
-	add	ebp, [esi + edi]		; ebp = residual[i] + (sum >> lp_quantization)
-	mov	[edi], ebp			; data[i] = residual[i] + (sum >> lp_quantization)
-	add	edi, byte 4
-
-	dec	ebx
-	jz	short .end
-	xor	ebp, ebp
-	jmp	edx
-
-.end:
-	pop	edi
-	pop	esi
-	pop	ebx
-	pop	ebp
-	ret
-
-; WATCHOUT: this routine works on 16 bit data which means bits-per-sample for
-; the channel and qlp_coeffs must be <= 16.  Especially note that this routine
-; cannot be used for side-channel coded 16bps channels since the effective bps
-; is 17.
-; WATCHOUT: this routine requires that each data array have a buffer of up to
-; 3 zeroes in front (at negative indices) for alignment purposes, i.e. for each
-; channel n, data[n][-1] through data[n][-3] should be accessible and zero.
-	ALIGN	16
-cident FLAC__lpc_restore_signal_asm_ia32_mmx
-	;[esp + 40]	data[]
-	;[esp + 36]	lp_quantization
-	;[esp + 32]	order
-	;[esp + 28]	qlp_coeff[]
-	;[esp + 24]	data_len
-	;[esp + 20]	residual[]
-
-	;ASSERT(order > 0)
-
-	push	ebp
-	push	ebx
-	push	esi
-	push	edi
-
-	mov	esi, [esp + 20]
-	mov	edi, [esp + 40]
-	mov	eax, [esp + 32]
-	mov	ebx, [esp + 24]
-
-	test	ebx, ebx
-	jz	near .end			; do nothing if data_len == 0
-	cmp	eax, byte 4
-	jb	near FLAC__lpc_restore_signal_asm_ia32.begin
-
-	mov	edx, [esp + 28]
-	movd	mm6, [esp + 36]
-	mov	ebp, esp
-
-	and	esp, 0xfffffff8
-
-	xor	ecx, ecx
-.copy_qlp_loop:
-	push	word [edx + 4 * ecx]
-	inc	ecx
-	cmp	ecx, eax
-	jnz	short .copy_qlp_loop
-
-	and	ecx, 0x3
-	test	ecx, ecx
-	je	short .za_end
-	sub	ecx, byte 4
-.za_loop:
-	push	word 0
-	inc	eax
-	inc	ecx
-	jnz	short .za_loop
-.za_end:
-
-	movq	mm5, [esp + 2 * eax - 8]
-	movd	mm4, [edi - 16]
-	punpckldq	mm4, [edi - 12]
-	movd	mm0, [edi - 8]
-	punpckldq	mm0, [edi - 4]
-	packssdw	mm4, mm0
-
-	cmp	eax, byte 4
-	jnbe	short .mmx_4more
-
-	ALIGN	16
-.mmx_4_loop_i:
-	movq	mm7, mm4
-	pmaddwd	mm7, mm5
-	movq	mm0, mm7
-	punpckhdq	mm7, mm7
-	paddd	mm7, mm0
-	psrad	mm7, mm6
-	movd	mm1, [esi]
-	paddd	mm7, mm1
-	movd	[edi], mm7
-	psllq	mm7, 48
-	psrlq	mm4, 16
-	por	mm4, mm7
-
-	add	esi, byte 4
-	add	edi, byte 4
-
-	dec	ebx
-	jnz	.mmx_4_loop_i
-	jmp	.mmx_end
-.mmx_4more:
-	shl	eax, 2
-	neg	eax
-	add	eax, byte 16
-	ALIGN	16
-.mmx_4more_loop_i:
-	mov	ecx, edi
-	add	ecx, eax
-	mov	edx, esp
-
-	movq	mm7, mm4
-	pmaddwd	mm7, mm5
-
-	ALIGN	16
-.mmx_4more_loop_j:
-	movd	mm0, [ecx - 16]
-	punpckldq	mm0, [ecx - 12]
-	movd	mm1, [ecx - 8]
-	punpckldq	mm1, [ecx - 4]
-	packssdw	mm0, mm1
-	pmaddwd	mm0, [edx]
-	paddd	mm7, mm0
-
-	add	edx, byte 8
-	add	ecx, byte 16
-	cmp	ecx, edi
-	jnz	.mmx_4more_loop_j
-
-	movq	mm0, mm7
-	punpckhdq	mm7, mm7
-	paddd	mm7, mm0
-	psrad	mm7, mm6
-	movd	mm1, [esi]
-	paddd	mm7, mm1
-	movd	[edi], mm7
-	psllq	mm7, 48
-	psrlq	mm4, 16
-	por	mm4, mm7
-
-	add	esi, byte 4
-	add	edi, byte 4
-
-	dec	ebx
-	jnz	short .mmx_4more_loop_i
-.mmx_end:
-	emms
-	mov	esp, ebp
-
-.end:
-	pop	edi
-	pop	esi
-	pop	ebx
-	pop	ebp
-	ret
-
-end
-
-%ifdef OBJ_FORMAT_elf
-       section .note.GNU-stack noalloc
-%endif
diff --git a/libFLAC/ia32/nasm.h b/libFLAC/ia32/nasm.h
deleted file mode 100644
index 215498d..0000000
--- a/libFLAC/ia32/nasm.h
+++ /dev/null
@@ -1,75 +0,0 @@
-;  libFLAC - Free Lossless Audio Codec library
-;  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-;
-;  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-;  contributors may be used to endorse or promote products derived from
-;  this software without specific prior written permission.
-;
-;  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 FOUNDATION 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.
-
-	bits 32
-
-%ifdef OBJ_FORMAT_win32
-	%define FLAC__PUBLIC_NEEDS_UNDERSCORE
-	%idefine code_section section .text align=16 class=CODE use32
-	%idefine data_section section .data align=32 class=DATA use32
-	%idefine bss_section  section .bss  align=32 class=DATA use32
-%elifdef OBJ_FORMAT_aout
-	%define FLAC__PUBLIC_NEEDS_UNDERSCORE
-	%idefine code_section section .text
-	%idefine data_section section .data
-	%idefine bss_section  section .bss
-%elifdef OBJ_FORMAT_aoutb
-	%define FLAC__PUBLIC_NEEDS_UNDERSCORE
-	%idefine code_section section .text
-	%idefine data_section section .data
-	%idefine bss_section  section .bss
-%elifdef OBJ_FORMAT_elf
-	%idefine code_section section .text align=16
-	%idefine data_section section .data align=32
-	%idefine bss_section  section .bss  align=32
-%else
-	%error unsupported object format!
-%endif
-
-%imacro cglobal 1
-	%ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
-		global _%1
-	%else
-		global %1
-	%endif
-%endmacro
-
-%imacro cextern 1
-	%ifdef FLAC__PUBLIC_NEEDS_UNDERSCORE
-		extern _%1
-	%else
-		extern %1
-	%endif
-%endmacro
-
-%imacro cident 1
-_%1:
-%1:
-%endmacro
diff --git a/libFLAC/ia32/stream_encoder_asm.nasm b/libFLAC/ia32/stream_encoder_asm.nasm
deleted file mode 100644
index b7ecef8..0000000
--- a/libFLAC/ia32/stream_encoder_asm.nasm
+++ /dev/null
@@ -1,159 +0,0 @@
-;  vim:filetype=nasm ts=8
-
-;  libFLAC - Free Lossless Audio Codec library
-;  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-;
-;  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-;  contributors may be used to endorse or promote products derived from
-;  this software without specific prior written permission.
-;
-;  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 FOUNDATION 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.
-
-%include "nasm.h"
-
-	data_section
-
-cglobal precompute_partition_info_sums_32bit_asm_ia32_
-
-	code_section
-
-
-; **********************************************************************
-;
-; void FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter)
-; void precompute_partition_info_sums_32bit_(
-; 	const FLAC__int32 residual[],
-; 	FLAC__uint64 abs_residual_partition_sums[],
-; 	unsigned blocksize,
-; 	unsigned predictor_order,
-; 	unsigned min_partition_order,
-; 	unsigned max_partition_order
-; )
-;
-	ALIGN 16
-cident precompute_partition_info_sums_32bit_asm_ia32_
-
-	;; peppered throughout the code at major checkpoints are keys like this as to where things are at that point in time
-	;; [esp + 4]	const FLAC__int32 residual[]
-	;; [esp + 8]	FLAC__uint64 abs_residual_partition_sums[]
-	;; [esp + 12]	unsigned blocksize
-	;; [esp + 16]	unsigned predictor_order
-	;; [esp + 20]	unsigned min_partition_order
-	;; [esp + 24]	unsigned max_partition_order
-	push	ebp
-	push	ebx
-	push	esi
-	push	edi
-	sub	esp, 8
-	;; [esp + 28]	const FLAC__int32 residual[]
-	;; [esp + 32]	FLAC__uint64 abs_residual_partition_sums[]
-	;; [esp + 36]	unsigned blocksize
-	;; [esp + 40]	unsigned predictor_order
-	;; [esp + 44]	unsigned min_partition_order
-	;; [esp + 48]	unsigned max_partition_order
-	;; [esp]	partitions
-	;; [esp + 4]	default_partition_samples
-
-	mov	ecx, [esp + 48]
-	mov	eax, 1
-	shl	eax, cl
-	mov	[esp], eax		; [esp] <- partitions = 1u << max_partition_order;
-	mov	eax, [esp + 36]
-	shr	eax, cl
-	mov	[esp + 4], eax		; [esp + 4] <- default_partition_samples = blocksize >> max_partition_order;
-
-	;
-	; first do max_partition_order
-	;
-	mov	edi, [esp + 4]
-	sub	edi, [esp + 40]		; edi <- end = (unsigned)(-(int)predictor_order) + default_partition_samples
-	xor	esi, esi		; esi <- residual_sample = 0
-	xor	ecx, ecx		; ecx <- partition = 0
-	mov	ebp, [esp + 28]		; ebp <- residual[]
-	xor	ebx, ebx		; ebx <- abs_residual_partition_sum = 0;
-	; note we put the updates to 'end' and 'abs_residual_partition_sum' at the end of loop0 and in the initialization above so we could align loop0 and loop1
-	ALIGN	16
-.loop0:					; for(partition = residual_sample = 0; partition < partitions; partition++) {
-.loop1:					;   for( ; residual_sample < end; residual_sample++)
-	mov	eax, [ebp + esi * 4]
-	cdq
-	xor	eax, edx
-	sub	eax, edx
-	add	ebx, eax		;     abs_residual_partition_sum += abs(residual[residual_sample]);
-	;@@@@@@ check overflow flag and abort here?
-	add	esi, byte 1
-	cmp	esi, edi		;   /* since the loop will always run at least once, we can put the loop check down here */
-	jb	.loop1
-.next1:
-	add	edi, [esp + 4]		;   end += default_partition_samples;
-	mov	eax, [esp + 32]
-	mov	[eax + ecx * 8], ebx	;   abs_residual_partition_sums[partition] = abs_residual_partition_sum;
-	mov	[eax + ecx * 8 + 4], dword 0
-	xor	ebx, ebx		;   abs_residual_partition_sum = 0;
-	add	ecx, byte 1
-	cmp	ecx, [esp]		; /* since the loop will always run at least once, we can put the loop check down here */
-	jb	.loop0
-.next0:					; }
-	;
-	; now merge partitions for lower orders
-	;
-	mov	esi, [esp + 32]		; esi <- abs_residual_partition_sums[from_partition==0];
-	mov	eax, [esp]
-	lea	edi, [esi + eax * 8]	; edi <- abs_residual_partition_sums[to_partition==partitions];
-	mov	ecx, [esp + 48]
-	sub	ecx, byte 1		; ecx <- partition_order = (int)max_partition_order - 1;
-	ALIGN 16
-.loop2:					; for(; partition_order >= (int)min_partition_order; partition_order--) {
-	cmp	ecx, [esp + 44]
-	jl	.next2
-	mov	edx, 1
-	shl	edx, cl			;   const unsigned partitions = 1u << partition_order;
-	ALIGN 16
-.loop3:					;   for(i = 0; i < partitions; i++) {
-	mov	eax, [esi]
-	mov	ebx, [esi + 4]
-	add	eax, [esi + 8]
-	adc	ebx, [esi + 12]
-	mov	[edi], eax
-	mov	[edi + 4], ebx		;     a_r_p_s[to_partition] = a_r_p_s[from_partition] + a_r_p_s[from_partition+1];
-	add	esi, byte 16
-	add	edi, byte 8
-	sub	edx, byte 1
-	jnz	.loop3			;   }
-	sub	ecx, byte 1
-	jmp	.loop2			; }
-.next2:
-
-	add	esp, 8
-	pop	edi
-	pop	esi
-	pop	ebx
-	pop	ebp
-	ret
-
-end
-
-%ifdef OBJ_FORMAT_elf
-	section .note.GNU-stack noalloc
-%endif
diff --git a/libFLAC/include/Makefile.am b/libFLAC/include/Makefile.am
deleted file mode 100644
index 866a894..0000000
--- a/libFLAC/include/Makefile.am
+++ /dev/null
@@ -1,31 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-SUBDIRS = private protected
diff --git a/libFLAC/include/Makefile.in b/libFLAC/include/Makefile.in
deleted file mode 100644
index ae91c1e..0000000
--- a/libFLAC/include/Makefile.in
+++ /dev/null
@@ -1,533 +0,0 @@
-# Makefile.in generated by automake 1.7.9 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEBUG_FALSE = @DEBUG_FALSE@
-DEBUG_TRUE = @DEBUG_TRUE@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
-DOXYGEN = @DOXYGEN@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@
-FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@
-FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@
-FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@
-FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@
-FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@
-FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@
-FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@
-FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@
-FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@
-FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@
-FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@
-FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@
-FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@
-FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@
-FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@
-FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@
-FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@
-FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@
-FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@
-FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@
-FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@
-FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@
-FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@
-FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@
-FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@
-FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@
-FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@
-FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@
-FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@
-FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@
-FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@
-FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@
-FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@
-GAS = @GAS@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBICONV = @LTLIBICONV@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@
-NASM = @NASM@
-OBJEXT = @OBJEXT@
-OBJ_FORMAT = @OBJ_FORMAT@
-OGG_CFLAGS = @OGG_CFLAGS@
-OGG_LIBS = @OGG_LIBS@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XMMS_CFLAGS = @XMMS_CFLAGS@
-XMMS_CONFIG = @XMMS_CONFIG@
-XMMS_DATA_DIR = @XMMS_DATA_DIR@
-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@
-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@
-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@
-XMMS_LIBS = @XMMS_LIBS@
-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@
-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@
-XMMS_VERSION = @XMMS_VERSION@
-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-
-SUBDIRS = private protected
-subdir = src/libFLAC/include
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-DIST_SOURCES =
-
-RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
-	ps-recursive install-info-recursive uninstall-info-recursive \
-	all-recursive install-data-recursive install-exec-recursive \
-	installdirs-recursive install-recursive uninstall-recursive \
-	check-recursive installcheck-recursive
-DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
-DIST_SUBDIRS = $(SUBDIRS)
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/libFLAC/include/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@set fnord $$MAKEFLAGS; amf=$$2; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
-	@set fnord $$MAKEFLAGS; amf=$$2; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if (etags --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	else \
-	  include_option=--include; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -f $$subdir/TAGS && \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ../../..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d $(distdir)/$$subdir \
-	    || mkdir $(distdir)/$$subdir \
-	    || exit 1; \
-	    (cd $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$(top_distdir)" \
-	        distdir=../$(distdir)/$$subdir \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-recursive
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
-	clean-generic clean-libtool clean-recursive ctags \
-	ctags-recursive distclean distclean-generic distclean-libtool \
-	distclean-recursive distclean-tags distdir dvi dvi-am \
-	dvi-recursive info info-am info-recursive install install-am \
-	install-data install-data-am install-data-recursive \
-	install-exec install-exec-am install-exec-recursive \
-	install-info install-info-am install-info-recursive install-man \
-	install-recursive install-strip installcheck installcheck-am \
-	installdirs installdirs-am installdirs-recursive \
-	maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-recursive pdf pdf-am \
-	pdf-recursive ps ps-am ps-recursive tags tags-recursive \
-	uninstall uninstall-am uninstall-info-am \
-	uninstall-info-recursive uninstall-recursive
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libFLAC/include/private/Makefile.am b/libFLAC/include/private/Makefile.am
deleted file mode 100644
index e8abc58..0000000
--- a/libFLAC/include/private/Makefile.am
+++ /dev/null
@@ -1,50 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-noinst_HEADERS = \
-	all.h \
-	bitmath.h \
-	bitreader.h \
-	bitwriter.h \
-	cpu.h \
-	crc.h \
-	fixed.h \
-	float.h \
-	format.h \
-	lpc.h \
-	md5.h \
-	memory.h \
-	metadata.h \
-	ogg_decoder_aspect.h \
-	ogg_encoder_aspect.h \
-	ogg_helper.h \
-	ogg_mapping.h \
-	stream_encoder_framing.h \
-	window.h
diff --git a/libFLAC/include/private/Makefile.in b/libFLAC/include/private/Makefile.in
deleted file mode 100644
index 4560242..0000000
--- a/libFLAC/include/private/Makefile.in
+++ /dev/null
@@ -1,455 +0,0 @@
-# Makefile.in generated by automake 1.7.9 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../../..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEBUG_FALSE = @DEBUG_FALSE@
-DEBUG_TRUE = @DEBUG_TRUE@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
-DOXYGEN = @DOXYGEN@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@
-FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@
-FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@
-FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@
-FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@
-FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@
-FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@
-FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@
-FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@
-FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@
-FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@
-FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@
-FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@
-FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@
-FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@
-FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@
-FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@
-FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@
-FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@
-FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@
-FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@
-FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@
-FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@
-FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@
-FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@
-FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@
-FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@
-FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@
-FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@
-FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@
-FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@
-FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@
-FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@
-FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@
-GAS = @GAS@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBICONV = @LTLIBICONV@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@
-NASM = @NASM@
-OBJEXT = @OBJEXT@
-OBJ_FORMAT = @OBJ_FORMAT@
-OGG_CFLAGS = @OGG_CFLAGS@
-OGG_LIBS = @OGG_LIBS@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XMMS_CFLAGS = @XMMS_CFLAGS@
-XMMS_CONFIG = @XMMS_CONFIG@
-XMMS_DATA_DIR = @XMMS_DATA_DIR@
-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@
-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@
-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@
-XMMS_LIBS = @XMMS_LIBS@
-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@
-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@
-XMMS_VERSION = @XMMS_VERSION@
-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-
-noinst_HEADERS = \
-	all.h \
-	bitmath.h \
-	bitreader.h \
-	bitwriter.h \
-	cpu.h \
-	crc.h \
-	fixed.h \
-	float.h \
-	format.h \
-	lpc.h \
-	md5.h \
-	memory.h \
-	metadata.h \
-	ogg_decoder_aspect.h \
-	ogg_encoder_aspect.h \
-	ogg_helper.h \
-	ogg_mapping.h \
-	stream_encoder_framing.h \
-	window.h
-
-subdir = src/libFLAC/include/private
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-DIST_SOURCES =
-HEADERS = $(noinst_HEADERS)
-
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.in Makefile.am
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/libFLAC/include/private/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ../../../..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am info \
-	info-am install install-am install-data install-data-am \
-	install-exec install-exec-am install-info install-info-am \
-	install-man install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-	ps ps-am tags uninstall uninstall-am uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libFLAC/include/private/all.h b/libFLAC/include/private/all.h
deleted file mode 100644
index a4463d2..0000000
--- a/libFLAC/include/private/all.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* libFLAC - Free Lossless Audio Codec library
- * Copyright (C) 2000-2009  Josh Coalson
- * Copyright (C) 2011-2014  Xiph.Org Foundation
- *
- * Redistribution and use 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 the Xiph.org Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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 FOUNDATION 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.
- */
-
-#ifndef FLAC__PRIVATE__ALL_H
-#define FLAC__PRIVATE__ALL_H
-
-#include "bitmath.h"
-#include "bitreader.h"
-#include "bitwriter.h"
-#include "cpu.h"
-#include "crc.h"
-#include "fixed.h"
-#include "float.h"
-#include "format.h"
-#include "lpc.h"
-#include "md5.h"
-#include "memory.h"
-#include "metadata.h"
-#include "stream_encoder_framing.h"
-
-#endif
diff --git a/libFLAC/include/protected/Makefile.am b/libFLAC/include/protected/Makefile.am
deleted file mode 100644
index 66c697c..0000000
--- a/libFLAC/include/protected/Makefile.am
+++ /dev/null
@@ -1,34 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-noinst_HEADERS = \
-	all.h \
-	stream_decoder.h \
-	stream_encoder.h
diff --git a/libFLAC/include/protected/Makefile.in b/libFLAC/include/protected/Makefile.in
deleted file mode 100644
index 96133a6..0000000
--- a/libFLAC/include/protected/Makefile.in
+++ /dev/null
@@ -1,439 +0,0 @@
-# Makefile.in generated by automake 1.7.9 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../../..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEBUG_FALSE = @DEBUG_FALSE@
-DEBUG_TRUE = @DEBUG_TRUE@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
-DOXYGEN = @DOXYGEN@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@
-FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@
-FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@
-FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@
-FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@
-FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@
-FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@
-FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@
-FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@
-FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@
-FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@
-FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@
-FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@
-FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@
-FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@
-FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@
-FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@
-FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@
-FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@
-FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@
-FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@
-FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@
-FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@
-FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@
-FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@
-FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@
-FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@
-FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@
-FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@
-FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@
-FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@
-FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@
-FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@
-FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@
-GAS = @GAS@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBICONV = @LTLIBICONV@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@
-NASM = @NASM@
-OBJEXT = @OBJEXT@
-OBJ_FORMAT = @OBJ_FORMAT@
-OGG_CFLAGS = @OGG_CFLAGS@
-OGG_LIBS = @OGG_LIBS@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XMMS_CFLAGS = @XMMS_CFLAGS@
-XMMS_CONFIG = @XMMS_CONFIG@
-XMMS_DATA_DIR = @XMMS_DATA_DIR@
-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@
-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@
-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@
-XMMS_LIBS = @XMMS_LIBS@
-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@
-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@
-XMMS_VERSION = @XMMS_VERSION@
-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-
-noinst_HEADERS = \
-	all.h \
-	stream_decoder.h \
-	stream_encoder.h
-
-subdir = src/libFLAC/include/protected
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-DIST_SOURCES =
-HEADERS = $(noinst_HEADERS)
-
-DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.in Makefile.am
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/libFLAC/include/protected/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ../../../..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(HEADERS)
-
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool \
-	distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool ctags distclean distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am info \
-	info-am install install-am install-data install-data-am \
-	install-exec install-exec-am install-info install-info-am \
-	install-man install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
-	ps ps-am tags uninstall uninstall-am uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libFLAC/include/protected/all.h b/libFLAC/include/protected/all.h
deleted file mode 100644
index 90912af..0000000
--- a/libFLAC/include/protected/all.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* libFLAC - Free Lossless Audio Codec library
- * Copyright (C) 2001-2009  Josh Coalson
- * Copyright (C) 2011-2014  Xiph.Org Foundation
- *
- * Redistribution and use 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 the Xiph.org Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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 FOUNDATION 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.
- */
-
-#ifndef FLAC__PROTECTED__ALL_H
-#define FLAC__PROTECTED__ALL_H
-
-#include "stream_decoder.h"
-#include "stream_encoder.h"
-
-#endif
diff --git a/libFLAC/libFLAC.m4 b/libFLAC/libFLAC.m4
deleted file mode 100644
index 24eb0c5..0000000
--- a/libFLAC/libFLAC.m4
+++ /dev/null
@@ -1,114 +0,0 @@
-# Configure paths for libFLAC
-# "Inspired" by ogg.m4
-
-dnl AM_PATH_LIBFLAC([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
-dnl Test for libFLAC, and define LIBFLAC_CFLAGS, LIBFLAC_LIBS, LIBFLAC_LIBDIR
-dnl
-AC_DEFUN([AM_PATH_LIBFLAC],
-[dnl 
-dnl Get the cflags and libraries
-dnl
-AC_ARG_WITH(libFLAC,[  --with-libFLAC=PFX   Prefix where libFLAC is installed (optional)], libFLAC_prefix="$withval", libFLAC_prefix="")
-AC_ARG_WITH(libFLAC-libraries,[  --with-libFLAC-libraries=DIR   Directory where libFLAC library is installed (optional)], libFLAC_libraries="$withval", libFLAC_libraries="")
-AC_ARG_WITH(libFLAC-includes,[  --with-libFLAC-includes=DIR   Directory where libFLAC header files are installed (optional)], libFLAC_includes="$withval", libFLAC_includes="")
-AC_ARG_ENABLE(libFLACtest, [  --disable-libFLACtest       Do not try to compile and run a test libFLAC program],, enable_libFLACtest=yes)
-
-  if test "x$libFLAC_libraries" != "x" ; then
-    LIBFLAC_LIBDIR="$libFLAC_libraries"
-  elif test "x$libFLAC_prefix" != "x" ; then
-    LIBFLAC_LIBDIR="$libFLAC_prefix/lib"
-  elif test "x$prefix" != "xNONE" ; then
-    LIBFLAC_LIBDIR="$libdir"
-  fi
-
-  LIBFLAC_LIBS="-L$LIBFLAC_LIBDIR -lFLAC $OGG_LIBS -lm"
-
-  if test "x$libFLAC_includes" != "x" ; then
-    LIBFLAC_CFLAGS="-I$libFLAC_includes"
-  elif test "x$libFLAC_prefix" != "x" ; then
-    LIBFLAC_CFLAGS="-I$libFLAC_prefix/include"
-  elif test "$prefix" != "xNONE"; then
-    LIBFLAC_CFLAGS=""
-  fi
-
-  AC_MSG_CHECKING(for libFLAC)
-  no_libFLAC=""
-
-
-  if test "x$enable_libFLACtest" = "xyes" ; then
-    ac_save_CFLAGS="$CFLAGS"
-    ac_save_CXXFLAGS="$CXXFLAGS"
-    ac_save_LIBS="$LIBS"
-    ac_save_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
-    CFLAGS="$CFLAGS $LIBFLAC_CFLAGS"
-    CXXFLAGS="$CXXFLAGS $LIBFLAC_CFLAGS"
-    LIBS="$LIBS $LIBFLAC_LIBS"
-    LD_LIBRARY_PATH="$LIBFLAC_LIBDIR:$LD_LIBRARY_PATH"
-dnl
-dnl Now check if the installed libFLAC is sufficiently new.
-dnl
-      rm -f conf.libFLACtest
-      AC_TRY_RUN([
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <FLAC/format.h>
-
-int main ()
-{
-  system("touch conf.libFLACtest");
-  return 0;
-}
-
-],, no_libFLAC=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
-       CFLAGS="$ac_save_CFLAGS"
-       CXXFLAGS="$ac_save_CXXFLAGS"
-       LIBS="$ac_save_LIBS"
-       LD_LIBRARY_PATH="$ac_save_LD_LIBRARY_PATH"
-  fi
-
-  if test "x$no_libFLAC" = "x" ; then
-     AC_MSG_RESULT(yes)
-     ifelse([$1], , :, [$1])     
-  else
-     AC_MSG_RESULT(no)
-     if test -f conf.libFLACtest ; then
-       :
-     else
-       echo "*** Could not run libFLAC test program, checking why..."
-       CFLAGS="$CFLAGS $LIBFLAC_CFLAGS"
-       CXXFLAGS="$CXXFLAGS $LIBFLAC_CFLAGS"
-       LIBS="$LIBS $LIBFLAC_LIBS"
-       LD_LIBRARY_PATH="$LIBFLAC_LIBDIR:$LD_LIBRARY_PATH"
-       AC_TRY_LINK([
-#include <stdio.h>
-#include <FLAC/format.h>
-],     [ return 0; ],
-       [ echo "*** The test program compiled, but did not run. This usually means"
-       echo "*** that the run-time linker is not finding libFLAC or finding the wrong"
-       echo "*** version of libFLAC. If it is not finding libFLAC, you'll need to set your"
-       echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
-       echo "*** to the installed location  Also, make sure you have run ldconfig if that"
-       echo "*** is required on your system"
-       echo "***"
-       echo "*** If you have an old version installed, it is best to remove it, although"
-       echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
-       [ echo "*** The test program failed to compile or link. See the file config.log for the"
-       echo "*** exact error that occured. This usually means libFLAC was incorrectly installed"
-       echo "*** or that you have moved libFLAC since it was installed. In the latter case, you"
-       echo "*** may want to edit the libFLAC-config script: $LIBFLAC_CONFIG" ])
-       CFLAGS="$ac_save_CFLAGS"
-       CXXFLAGS="$ac_save_CXXFLAGS"
-       LIBS="$ac_save_LIBS"
-       LD_LIBRARY_PATH="$ac_save_LD_LIBRARY_PATH"
-     fi
-     LIBFLAC_CFLAGS=""
-     LIBFLAC_LIBDIR=""
-     LIBFLAC_LIBS=""
-     ifelse([$2], , :, [$2])
-  fi
-  AC_SUBST(LIBFLAC_CFLAGS)
-  AC_SUBST(LIBFLAC_LIBDIR)
-  AC_SUBST(LIBFLAC_LIBS)
-  rm -f conf.libFLACtest
-])
diff --git a/libFLAC/libFLAC_dynamic.dsp b/libFLAC/libFLAC_dynamic.dsp
deleted file mode 100644
index 243f639..0000000
--- a/libFLAC/libFLAC_dynamic.dsp
+++ /dev/null
@@ -1,464 +0,0 @@
-# Microsoft Developer Studio Project File - Name="libFLAC_dynamic" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=libFLAC_dynamic - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "libFLAC_dynamic.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "libFLAC_dynamic.mak" CFG="libFLAC_dynamic - Win32 Debug"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "libFLAC_dynamic - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE "libFLAC_dynamic - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
-!MESSAGE 
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "libFLAC"
-# PROP Scc_LocalPath "..\.."
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-
-!IF  "$(CFG)" == "libFLAC_dynamic - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\obj\release\lib"
-# PROP Intermediate_Dir "Release_dynamic"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I ".\include" /I "..\..\include" /D "NDEBUG" /D "FLAC_API_EXPORTS" /D "FLAC__HAS_OGG" /D VERSION=\"1.2.1\" /D "FLAC__CPU_IA32" /D "FLAC__HAS_NASM" /D "FLAC__USE_3DNOW" /D "_WINDOWS" /D "_WINDLL" /D "WIN32" /D "_USRDLL" /FR /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG" /d "_USRDLL"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
-# ADD LINK32 ..\..\obj\release\lib\ogg_static.lib /nologo /subsystem:windows /dll /machine:I386 /out:"..\..\obj\release\bin/libFLAC.dll"
-
-!ELSEIF  "$(CFG)" == "libFLAC_dynamic - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\obj\debug\lib"
-# PROP Intermediate_Dir "Debug_dynamic"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
-# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /I ".\include" /I "..\..\include" /D "_DEBUG" /D "DEBUG" /D "FLAC__OVERFLOW_DETECT" /D "FLAC_API_EXPORTS" /D "FLAC__HAS_OGG" /D VERSION=\"1.2.1\" /D "FLAC__CPU_IA32" /D "FLAC__HAS_NASM" /D "FLAC__USE_3DNOW" /D "_WINDOWS" /D "_WINDLL" /D "WIN32" /D "_USRDLL" /FR /FD /c
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG" /d "_USRDLL"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 ..\..\obj\release\lib\ogg_static.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"..\..\obj\debug\bin/libFLAC.dll" /pdbtype:sept
-
-!ENDIF 
-
-# Begin Target
-
-# Name "libFLAC_dynamic - Win32 Release"
-# Name "libFLAC_dynamic - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "c"
-# Begin Group "Assembly Files (ia32)"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\ia32\bitreader_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_dynamic - Win32 Release"
-
-USERDEP__CPU_A="ia32/bitreader_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\bitreader_asm.nasm
-
-"ia32/bitreader_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/bitreader_asm.nasm -o ia32/bitreader_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_dynamic - Win32 Debug"
-
-USERDEP__CPU_A="ia32/bitreader_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\bitreader_asm.nasm
-
-"ia32/bitreader_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/bitreader_asm.nasm -o ia32/bitreader_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\cpu_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_dynamic - Win32 Release"
-
-USERDEP__CPU_A="ia32/cpu_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\cpu_asm.nasm
-
-"ia32/cpu_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/cpu_asm.nasm -o ia32/cpu_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_dynamic - Win32 Debug"
-
-USERDEP__CPU_A="ia32/cpu_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\cpu_asm.nasm
-
-"ia32/cpu_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/cpu_asm.nasm -o ia32/cpu_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\fixed_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_dynamic - Win32 Release"
-
-USERDEP__FIXED="ia32/fixed_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\fixed_asm.nasm
-
-"ia32/fixed_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/fixed_asm.nasm -o ia32/fixed_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_dynamic - Win32 Debug"
-
-USERDEP__FIXED="ia32/fixed_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\fixed_asm.nasm
-
-"ia32/fixed_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/fixed_asm.nasm -o ia32/fixed_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\lpc_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_dynamic - Win32 Release"
-
-USERDEP__LPC_A="ia32/lpc_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\lpc_asm.nasm
-
-"ia32/lpc_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/lpc_asm.nasm -o ia32/lpc_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_dynamic - Win32 Debug"
-
-USERDEP__LPC_A="ia32/lpc_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\lpc_asm.nasm
-
-"ia32/lpc_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/lpc_asm.nasm -o ia32/lpc_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\stream_encoder_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_dynamic - Win32 Release"
-
-USERDEP__CPU_A="ia32/stream_encoder_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\stream_encoder_asm.nasm
-
-"ia32/stream_encoder_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/stream_encoder_asm.nasm -o ia32/stream_encoder_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_dynamic - Win32 Debug"
-
-USERDEP__CPU_A="ia32/stream_encoder_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\stream_encoder_asm.nasm
-
-"ia32/stream_encoder_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/stream_encoder_asm.nasm -o ia32/stream_encoder_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\nasm.h
-# End Source File
-# End Group
-# Begin Source File
-
-SOURCE=.\bitmath.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\bitreader.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\bitwriter.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\cpu.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\crc.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\fixed.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\float.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\format.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\lpc.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\md5.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\memory.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\metadata_iterators.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\metadata_object.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ogg_decoder_aspect.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ogg_encoder_aspect.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ogg_helper.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ogg_mapping.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\stream_decoder.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\stream_encoder.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\stream_encoder_framing.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\window.c
-# End Source File
-# End Group
-# Begin Group "Private Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\include\private\all.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\bitmath.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\bitreader.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\bitwriter.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\cpu.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\crc.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\fixed.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\float.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\format.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\lpc.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\md5.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\memory.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\metadata.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\ogg_decoder_aspect.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\ogg_encoder_aspect.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\ogg_helper.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\ogg_mapping.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\stream_encoder_framing.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\window.h
-# End Source File
-# End Group
-# Begin Group "Protected Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\include\protected\all.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\protected\stream_decoder.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\protected\stream_encoder.h
-# End Source File
-# End Group
-# Begin Group "Public Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\all.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\assert.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\export.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\format.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\metadata.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\ordinals.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\stream_decoder.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\stream_encoder.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/libFLAC/libFLAC_dynamic.vcproj b/libFLAC/libFLAC_dynamic.vcproj
deleted file mode 100644
index fe2a20c..0000000
--- a/libFLAC/libFLAC_dynamic.vcproj
+++ /dev/null
@@ -1,540 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="libFLAC_dynamic"
-	ProjectGUID="{4cefbc83-c215-11db-8314-0800200c9a66}"
-	RootNamespace="libFLAC_dynamic"
-	Keyword="Win32Proj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="..\..\obj\debug\lib"
-			IntermediateDirectory="Debug_dynamic"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories=".\include;..\..\include"
-				PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;FLAC_API_EXPORTS;FLAC__HAS_OGG;FLAC__CPU_IA32;FLAC__HAS_NASM;FLAC__USE_3DNOW;VERSION=\&quot;1.2.0\&quot;;DEBUG;FLAC__OVERFLOW_DETECT"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="4"
-				CompileAs="0"
-				DisableSpecificWarnings="4267;4996"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="..\..\obj\release\lib\ogg_static.lib"
-				LinkIncremental="2"
-				IgnoreDefaultLibraryNames="uuid.lib"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="..\..\obj\release\lib"
-			IntermediateDirectory="Release_dynamic"
-			ConfigurationType="2"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				EnableIntrinsicFunctions="true"
-				FavorSizeOrSpeed="1"
-				OmitFramePointers="true"
-				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=".\include;..\..\include"
-				PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;FLAC_API_EXPORTS;FLAC__HAS_OGG;FLAC__CPU_IA32;FLAC__HAS_NASM;FLAC__USE_3DNOW;VERSION=\&quot;1.2.0\&quot;"
-				RuntimeLibrary="0"
-				BufferSecurityCheck="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-				CompileAs="0"
-				DisableSpecificWarnings="4267;4996"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="..\..\obj\release\lib\ogg_static.lib"
-				LinkIncremental="1"
-				IgnoreDefaultLibraryNames="uuid.lib"
-				GenerateDebugInformation="true"
-				SubSystem="2"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				LinkTimeCodeGeneration="1"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath=".\include\private\all.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\protected\all.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\bitmath.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\bitreader.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\bitwriter.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\cpu.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\crc.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\fixed.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\float.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\format.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\lpc.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\md5.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\memory.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\metadata.h"
-				>
-			</File>
-			<File
-				RelativePath=".\ia32\nasm.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\ogg_decoder_aspect.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\ogg_encoder_aspect.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\ogg_helper.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\ogg_mapping.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\protected\stream_decoder.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\protected\stream_encoder.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\stream_encoder_framing.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\window.h"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath=".\bitmath.c"
-				>
-			</File>
-			<File
-				RelativePath=".\bitreader.c"
-				>
-			</File>
-			<File
-				RelativePath=".\bitwriter.c"
-				>
-			</File>
-			<File
-				RelativePath=".\cpu.c"
-				>
-			</File>
-			<File
-				RelativePath=".\crc.c"
-				>
-			</File>
-			<File
-				RelativePath=".\fixed.c"
-				>
-			</File>
-			<File
-				RelativePath=".\float.c"
-				>
-			</File>
-			<File
-				RelativePath=".\format.c"
-				>
-			</File>
-			<File
-				RelativePath=".\lpc.c"
-				>
-			</File>
-			<File
-				RelativePath=".\md5.c"
-				>
-			</File>
-			<File
-				RelativePath=".\memory.c"
-				>
-			</File>
-			<File
-				RelativePath=".\metadata_iterators.c"
-				>
-			</File>
-			<File
-				RelativePath=".\metadata_object.c"
-				>
-			</File>
-			<File
-				RelativePath=".\ogg_decoder_aspect.c"
-				>
-			</File>
-			<File
-				RelativePath=".\ogg_encoder_aspect.c"
-				>
-			</File>
-			<File
-				RelativePath=".\ogg_helper.c"
-				>
-			</File>
-			<File
-				RelativePath=".\ogg_mapping.c"
-				>
-			</File>
-			<File
-				RelativePath=".\stream_decoder.c"
-				>
-			</File>
-			<File
-				RelativePath=".\stream_encoder.c"
-				>
-			</File>
-			<File
-				RelativePath=".\stream_encoder_framing.c"
-				>
-			</File>
-			<File
-				RelativePath=".\window.c"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Public Header Files"
-			>
-			<File
-				RelativePath="..\..\include\FLAC\all.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\assert.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\callback.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\export.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\format.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\metadata.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\ordinals.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\stream_decoder.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\stream_encoder.h"
-				>
-			</File>
-		</Filter>
-		<File
-			RelativePath=".\ia32\bitreader_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/bitreader_asm.nasm -o ia32/bitreader_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/bitreader_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/bitreader_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/bitreader_asm.nasm -o ia32/bitreader_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/bitreader_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/bitreader_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-		<File
-			RelativePath=".\release_static\BuildLog.htm"
-			>
-		</File>
-		<File
-			RelativePath=".\ia32\cpu_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/cpu_asm.nasm -o ia32/cpu_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/cpu_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/cpu_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/cpu_asm.nasm -o ia32/cpu_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/cpu_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/cpu_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-		<File
-			RelativePath=".\ia32\fixed_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/fixed_asm.nasm -o ia32/fixed_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/fixed_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/fixed_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/fixed_asm.nasm -o ia32/fixed_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/fixed_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/fixed_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-		<File
-			RelativePath=".\ia32\lpc_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/lpc_asm.nasm -o ia32/lpc_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/lpc_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/lpc_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/lpc_asm.nasm -o ia32/lpc_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/lpc_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/lpc_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-		<File
-			RelativePath=".\ia32\stream_encoder_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/stream_encoder_asm.nasm -o ia32/stream_encoder_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/stream_encoder_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/stream_encoder_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/stream_encoder_asm.nasm -o ia32/stream_encoder_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/stream_encoder_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/stream_encoder_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/libFLAC/libFLAC_static.dsp b/libFLAC/libFLAC_static.dsp
deleted file mode 100644
index 9726b8a..0000000
--- a/libFLAC/libFLAC_static.dsp
+++ /dev/null
@@ -1,457 +0,0 @@
-# Microsoft Developer Studio Project File - Name="libFLAC_static" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=libFLAC_static - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE 
-!MESSAGE NMAKE /f "libFLAC_static.mak".
-!MESSAGE 
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE 
-!MESSAGE NMAKE /f "libFLAC_static.mak" CFG="libFLAC_static - Win32 Debug"
-!MESSAGE 
-!MESSAGE Possible choices for configuration are:
-!MESSAGE 
-!MESSAGE "libFLAC_static - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "libFLAC_static - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE 
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName "libFLAC"
-# PROP Scc_LocalPath "..\.."
-CPP=cl.exe
-RSC=rc.exe
-
-!IF  "$(CFG)" == "libFLAC_static - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\obj\release\lib"
-# PROP Intermediate_Dir "Release_static"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /MD /W3 /GX /O2 /Op /I ".\include" /I "..\..\include" /D VERSION=\"1.2.1\" /D "FLAC__NO_DLL" /D "FLAC__HAS_OGG" /D "FLAC__CPU_IA32" /D "FLAC__HAS_NASM" /D "FLAC__USE_3DNOW" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /nodefaultlib
-
-!ELSEIF  "$(CFG)" == "libFLAC_static - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\obj\debug\lib"
-# PROP Intermediate_Dir "Debug_static"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I ".\include" /I "..\..\include" /D VERSION=\"1.2.1\" /D "FLAC__NO_DLL" /D "FLAC__HAS_OGG" /D "FLAC__CPU_IA32" /D "FLAC__HAS_NASM" /D "FLAC__USE_3DNOW" /D "WIN32" /D "_DEBUG" /D "DEBUG" /D "FLAC__OVERFLOW_DETECT" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /nodefaultlib
-
-!ENDIF 
-
-# Begin Target
-
-# Name "libFLAC_static - Win32 Release"
-# Name "libFLAC_static - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "c"
-# Begin Group "Assembly Files (ia32)"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\ia32\bitreader_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_static - Win32 Release"
-
-USERDEP__CPU_A="ia32/bitreader_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\bitreader_asm.nasm
-
-"ia32/bitreader_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/bitreader_asm.nasm -o ia32/bitreader_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_static - Win32 Debug"
-
-USERDEP__CPU_A="ia32/bitreader_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\bitreader_asm.nasm
-
-"ia32/bitreader_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/bitreader_asm.nasm -o ia32/bitreader_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\cpu_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_static - Win32 Release"
-
-USERDEP__CPU_A="ia32/cpu_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\cpu_asm.nasm
-
-"ia32/cpu_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/cpu_asm.nasm -o ia32/cpu_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_static - Win32 Debug"
-
-USERDEP__CPU_A="ia32/cpu_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\cpu_asm.nasm
-
-"ia32/cpu_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/cpu_asm.nasm -o ia32/cpu_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\fixed_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_static - Win32 Release"
-
-USERDEP__FIXED="ia32/fixed_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\fixed_asm.nasm
-
-"ia32/fixed_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/fixed_asm.nasm -o ia32/fixed_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_static - Win32 Debug"
-
-USERDEP__FIXED="ia32/fixed_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\fixed_asm.nasm
-
-"ia32/fixed_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/fixed_asm.nasm -o ia32/fixed_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\lpc_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_static - Win32 Release"
-
-USERDEP__LPC_A="ia32/lpc_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\lpc_asm.nasm
-
-"ia32/lpc_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/lpc_asm.nasm -o ia32/lpc_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_static - Win32 Debug"
-
-USERDEP__LPC_A="ia32/lpc_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\lpc_asm.nasm
-
-"ia32/lpc_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/lpc_asm.nasm -o ia32/lpc_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\stream_encoder_asm.nasm
-
-!IF  "$(CFG)" == "libFLAC_static - Win32 Release"
-
-USERDEP__CPU_A="ia32/stream_encoder_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\stream_encoder_asm.nasm
-
-"ia32/stream_encoder_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/stream_encoder_asm.nasm -o ia32/stream_encoder_asm.obj
-
-# End Custom Build
-
-!ELSEIF  "$(CFG)" == "libFLAC_static - Win32 Debug"
-
-USERDEP__CPU_A="ia32/stream_encoder_asm.nasm"	
-# Begin Custom Build
-InputPath=.\ia32\stream_encoder_asm.nasm
-
-"ia32/stream_encoder_asm.obj" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
-	nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/stream_encoder_asm.nasm -o ia32/stream_encoder_asm.obj
-
-# End Custom Build
-
-!ENDIF 
-
-# End Source File
-# Begin Source File
-
-SOURCE=.\ia32\nasm.h
-# End Source File
-# End Group
-# Begin Source File
-
-SOURCE=.\bitmath.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\bitreader.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\bitwriter.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\cpu.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\crc.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\fixed.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\float.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\format.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\lpc.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\md5.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\memory.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\metadata_iterators.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\metadata_object.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ogg_decoder_aspect.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ogg_encoder_aspect.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ogg_helper.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\ogg_mapping.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\stream_decoder.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\stream_encoder.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\stream_encoder_framing.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\window.c
-# End Source File
-# End Group
-# Begin Group "Private Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\include\private\all.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\bitmath.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\bitreader.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\bitwriter.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\cpu.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\crc.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\fixed.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\float.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\format.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\lpc.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\md5.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\memory.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\metadata.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\ogg_decoder_aspect.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\ogg_encoder_aspect.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\ogg_helper.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\ogg_mapping.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\stream_encoder_framing.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\private\window.h
-# End Source File
-# End Group
-# Begin Group "Protected Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\include\protected\all.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\protected\stream_decoder.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\include\protected\stream_encoder.h
-# End Source File
-# End Group
-# Begin Group "Public Header Files"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\all.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\assert.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\export.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\format.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\metadata.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\ordinals.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\stream_decoder.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\include\FLAC\stream_encoder.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/libFLAC/libFLAC_static.vcproj b/libFLAC/libFLAC_static.vcproj
deleted file mode 100644
index fdb1b2f..0000000
--- a/libFLAC/libFLAC_static.vcproj
+++ /dev/null
@@ -1,505 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="libFLAC_static"
-	ProjectGUID="{4cefbc84-c215-11db-8314-0800200c9a66}"
-	RootNamespace="libFLAC_static"
-	Keyword="Win32Proj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="..\..\obj\debug\lib"
-			IntermediateDirectory="Debug_static"
-			ConfigurationType="4"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories=".\include;..\..\include"
-				PreprocessorDefinitions="WIN32;_DEBUG;_LIB;FLAC__HAS_OGG;FLAC__CPU_IA32;FLAC__HAS_NASM;FLAC__USE_3DNOW;VERSION=\&quot;1.2.0\&quot;;FLAC__NO_DLL;DEBUG;FLAC__OVERFLOW_DETECT"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="1"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="4"
-				CompileAs="0"
-				DisableSpecificWarnings="4267;4996"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLibrarianTool"
-				OutputFile="..\..\obj\debug\lib\$(ProjectName).lib"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="..\..\obj\release\lib"
-			IntermediateDirectory="Release_static"
-			ConfigurationType="4"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				EnableIntrinsicFunctions="true"
-				FavorSizeOrSpeed="1"
-				OmitFramePointers="true"
-				WholeProgramOptimization="true"
-				AdditionalIncludeDirectories=".\include;..\..\include"
-				PreprocessorDefinitions="WIN32;NDEBUG;_LIB;FLAC__HAS_OGG;FLAC__CPU_IA32;FLAC__HAS_NASM;FLAC__USE_3DNOW;VERSION=\&quot;1.2.0\&quot;;FLAC__NO_DLL"
-				RuntimeLibrary="0"
-				BufferSecurityCheck="false"
-				UsePrecompiledHeader="0"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-				CompileAs="0"
-				DisableSpecificWarnings="4267;4996"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLibrarianTool"
-				OutputFile="..\..\obj\release\lib\$(ProjectName).lib"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Header Files"
-			Filter="h;hpp;hxx;hm;inl;inc;xsd"
-			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
-			>
-			<File
-				RelativePath=".\include\protected\all.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\all.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\bitmath.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\bitreader.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\bitwriter.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\cpu.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\crc.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\fixed.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\float.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\format.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\lpc.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\md5.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\memory.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\metadata.h"
-				>
-			</File>
-			<File
-				RelativePath=".\ia32\nasm.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\ogg_decoder_aspect.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\ogg_encoder_aspect.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\ogg_helper.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\ogg_mapping.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\protected\stream_decoder.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\protected\stream_encoder.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\stream_encoder_framing.h"
-				>
-			</File>
-			<File
-				RelativePath=".\include\private\window.h"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Public Header Files"
-			>
-			<File
-				RelativePath="..\..\include\FLAC\all.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\assert.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\callback.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\export.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\format.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\metadata.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\ordinals.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\stream_decoder.h"
-				>
-			</File>
-			<File
-				RelativePath="..\..\include\FLAC\stream_encoder.h"
-				>
-			</File>
-		</Filter>
-		<Filter
-			Name="Source Files"
-			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
-			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
-			>
-			<File
-				RelativePath=".\bitmath.c"
-				>
-			</File>
-			<File
-				RelativePath=".\bitreader.c"
-				>
-			</File>
-			<File
-				RelativePath=".\bitwriter.c"
-				>
-			</File>
-			<File
-				RelativePath=".\cpu.c"
-				>
-			</File>
-			<File
-				RelativePath=".\crc.c"
-				>
-			</File>
-			<File
-				RelativePath=".\fixed.c"
-				>
-			</File>
-			<File
-				RelativePath=".\float.c"
-				>
-			</File>
-			<File
-				RelativePath=".\format.c"
-				>
-			</File>
-			<File
-				RelativePath=".\lpc.c"
-				>
-			</File>
-			<File
-				RelativePath=".\md5.c"
-				>
-			</File>
-			<File
-				RelativePath=".\memory.c"
-				>
-			</File>
-			<File
-				RelativePath=".\metadata_iterators.c"
-				>
-			</File>
-			<File
-				RelativePath=".\metadata_object.c"
-				>
-			</File>
-			<File
-				RelativePath=".\ogg_decoder_aspect.c"
-				>
-			</File>
-			<File
-				RelativePath=".\ogg_encoder_aspect.c"
-				>
-			</File>
-			<File
-				RelativePath=".\ogg_helper.c"
-				>
-			</File>
-			<File
-				RelativePath=".\ogg_mapping.c"
-				>
-			</File>
-			<File
-				RelativePath=".\stream_decoder.c"
-				>
-			</File>
-			<File
-				RelativePath=".\stream_encoder.c"
-				>
-			</File>
-			<File
-				RelativePath=".\stream_encoder_framing.c"
-				>
-			</File>
-			<File
-				RelativePath=".\window.c"
-				>
-			</File>
-		</Filter>
-		<File
-			RelativePath=".\ia32\bitreader_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/bitreader_asm.nasm -o ia32/bitreader_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/bitreader_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/bitreader_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/bitreader_asm.nasm -o ia32/bitreader_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/bitreader_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/bitreader_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-		<File
-			RelativePath=".\ia32\cpu_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/cpu_asm.nasm -o ia32/cpu_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/cpu_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/cpu_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/cpu_asm.nasm -o ia32/cpu_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/cpu_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/cpu_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-		<File
-			RelativePath=".\ia32\fixed_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/fixed_asm.nasm -o ia32/fixed_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/fixed_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/fixed_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/fixed_asm.nasm -o ia32/fixed_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/fixed_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/fixed_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-		<File
-			RelativePath=".\ia32\lpc_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/lpc_asm.nasm -o ia32/lpc_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/lpc_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/lpc_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/lpc_asm.nasm -o ia32/lpc_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/lpc_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/lpc_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-		<File
-			RelativePath=".\ia32\stream_encoder_asm.nasm"
-			>
-			<FileConfiguration
-				Name="Debug|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/stream_encoder_asm.nasm -o ia32/stream_encoder_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/stream_encoder_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/stream_encoder_asm.obj"
-				/>
-			</FileConfiguration>
-			<FileConfiguration
-				Name="Release|Win32"
-				>
-				<Tool
-					Name="VCCustomBuildTool"
-					CommandLine="nasmw.exe -f win32 -d OBJ_FORMAT_win32 -i ia32/ ia32/stream_encoder_asm.nasm -o ia32/stream_encoder_asm.obj&#x0D;&#x0A;"
-					AdditionalDependencies="ia32/stream_encoder_asm.nasm;ia32/nasm.h"
-					Outputs="ia32/stream_encoder_asm.obj"
-				/>
-			</FileConfiguration>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/libFLAC/lpc.c b/libFLAC/lpc.c
index f7c643a..5c6e175 100644
--- a/libFLAC/lpc.c
+++ b/libFLAC/lpc.c
@@ -288,6 +288,7 @@
 		for(j = 0; j < order; j++) {
 			sum += qlp_coeff[j] * (*(--history));
 			sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history);
+			if(sumo > 2147483647ll || sumo < -2147483648ll)
 				fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo);
 		}
 		*(residual++) = *(data++) - (sum >> lp_quantization);
diff --git a/libFLAC/md5.c b/libFLAC/md5.c
index e5adc3e..e9013a9 100644
--- a/libFLAC/md5.c
+++ b/libFLAC/md5.c
@@ -224,7 +224,7 @@
 	ctx->bytes[0] = 0;
 	ctx->bytes[1] = 0;
 
-	ctx->internal_buf.p8= 0;
+	ctx->internal_buf.p8 = 0;
 	ctx->capacity = 0;
 }
 
@@ -262,7 +262,7 @@
 	memcpy(digest, ctx->buf, 16);
 	if (0 != ctx->internal_buf.p8) {
 		free(ctx->internal_buf.p8);
-		ctx->internal_buf.p8= 0;
+		ctx->internal_buf.p8 = 0;
 		ctx->capacity = 0;
 	}
 	memset(ctx, 0, sizeof(*ctx));	/* In case it's sensitive */
@@ -499,14 +499,12 @@
 		return false;
 
 	if (ctx->capacity < bytes_needed) {
-		FLAC__byte *tmp = realloc(ctx->internal_buf.p8, bytes_needed);
-		if (0 == tmp) {
-			free(ctx->internal_buf.p8);
-			if (0 == (ctx->internal_buf.p8= safe_malloc_(bytes_needed)))
+		if (0 == (ctx->internal_buf.p8 = safe_realloc_(ctx->internal_buf.p8, bytes_needed))) {
+			if (0 == (ctx->internal_buf.p8 = safe_malloc_(bytes_needed))) {
+				ctx->capacity = 0;
 				return false;
+			}
 		}
-		else
-			ctx->internal_buf.p8= tmp;
 		ctx->capacity = bytes_needed;
 	}
 
diff --git a/libFLAC/metadata_iterators.c b/libFLAC/metadata_iterators.c
deleted file mode 100644
index 8b9dbec..0000000
--- a/libFLAC/metadata_iterators.c
+++ /dev/null
@@ -1,3364 +0,0 @@
-/* libFLAC - Free Lossless Audio Codec library
- * Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
- *
- * Redistribution and use 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 the Xiph.org Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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 FOUNDATION 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.
- */
-
-#if HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__
-#if defined __BORLANDC__
-#include <utime.h> /* for utime() */
-#else
-#include <sys/utime.h> /* for utime() */
-#endif
-#include <io.h> /* for chmod() */
-#include <sys/types.h> /* for off_t */
-#if _MSC_VER <= 1600 || defined __BORLANDC__ /* @@@ [2G limit] */
-#define fseeko fseek
-#define ftello ftell
-#endif
-#else
-#include <sys/types.h> /* some flavors of BSD (like OS X) require this to get time_t */
-#include <utime.h> /* for utime() */
-#include <unistd.h> /* for chown(), unlink() */
-#endif
-#include <sys/stat.h> /* for stat(), maybe chmod() */
-
-#include "private/metadata.h"
-
-#include "FLAC/assert.h"
-#include "FLAC/stream_decoder.h"
-#include "share/alloc.h"
-
-#ifdef max
-#undef max
-#endif
-#define max(a,b) ((a)>(b)?(a):(b))
-#ifdef min
-#undef min
-#endif
-#define min(a,b) ((a)<(b)?(a):(b))
-
-
-/****************************************************************************
- *
- * Local function declarations
- *
- ***************************************************************************/
-
-static void pack_uint32_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes);
-static void pack_uint32_little_endian_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes);
-static void pack_uint64_(FLAC__uint64 val, FLAC__byte *b, unsigned bytes);
-static FLAC__uint32 unpack_uint32_(FLAC__byte *b, unsigned bytes);
-static FLAC__uint32 unpack_uint32_little_endian_(FLAC__byte *b, unsigned bytes);
-static FLAC__uint64 unpack_uint64_(FLAC__byte *b, unsigned bytes);
-
-static FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator);
-static FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block);
-static FLAC__bool read_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__bool *is_last, FLAC__MetadataType *type, unsigned *length);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata *block);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_StreamInfo *block);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_Padding *block, unsigned block_length);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Application *block, unsigned block_length);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_SeekTable *block, unsigned block_length);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_entry_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment_Entry *entry);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment *block);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_track_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet_Track *track);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet *block);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Picture *block);
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Unknown *block, unsigned block_length);
-
-static FLAC__bool write_metadata_block_header_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block);
-static FLAC__bool write_metadata_block_data_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block);
-static FLAC__bool write_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block);
-static FLAC__bool write_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block);
-static FLAC__bool write_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_StreamInfo *block);
-static FLAC__bool write_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Padding *block, unsigned block_length);
-static FLAC__bool write_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Application *block, unsigned block_length);
-static FLAC__bool write_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_SeekTable *block);
-static FLAC__bool write_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_VorbisComment *block);
-static FLAC__bool write_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_CueSheet *block);
-static FLAC__bool write_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Picture *block);
-static FLAC__bool write_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Unknown *block, unsigned block_length);
-
-static FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block);
-static FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last);
-static FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append);
-
-static void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator);
-static FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator);
-
-static unsigned seek_to_first_metadata_block_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb);
-static unsigned seek_to_first_metadata_block_(FILE *f);
-
-static FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append);
-static FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, off_t fixup_is_last_flag_offset, FLAC__bool backup);
-
-static FLAC__bool copy_n_bytes_from_file_(FILE *file, FILE *tempfile, off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status);
-static FLAC__bool copy_n_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status);
-static FLAC__bool copy_remaining_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__Metadata_SimpleIteratorStatus *status);
-static FLAC__bool copy_remaining_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__Metadata_SimpleIteratorStatus *status);
-
-static FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status);
-static FLAC__bool transport_tempfile_(const char *filename, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status);
-static void cleanup_tempfile_(FILE **tempfile, char **tempfilename);
-
-static FLAC__bool get_file_stats_(const char *filename, struct stat *stats);
-static void set_file_stats_(const char *filename, struct stat *stats);
-
-static int fseek_wrapper_(FLAC__IOHandle handle, FLAC__int64 offset, int whence);
-static FLAC__int64 ftell_wrapper_(FLAC__IOHandle handle);
-
-static FLAC__Metadata_ChainStatus get_equivalent_status_(FLAC__Metadata_SimpleIteratorStatus status);
-
-
-#ifdef FLAC__VALGRIND_TESTING
-static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
-{
-	size_t ret = fwrite(ptr, size, nmemb, stream);
-	if(!ferror(stream))
-		fflush(stream);
-	return ret;
-}
-#else
-#define local__fwrite fwrite
-#endif
-
-/****************************************************************************
- *
- * Level 0 implementation
- *
- ***************************************************************************/
-
-static FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data);
-static void metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data);
-static void error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data);
-
-typedef struct {
-	FLAC__bool got_error;
-	FLAC__StreamMetadata *object;
-} level0_client_data;
-
-static FLAC__StreamMetadata *get_one_metadata_block_(const char *filename, FLAC__MetadataType type)
-{
-	level0_client_data cd;
-	FLAC__StreamDecoder *decoder;
-
-	FLAC__ASSERT(0 != filename);
-
-	cd.got_error = false;
-	cd.object = 0;
-
-	decoder = FLAC__stream_decoder_new();
-
-	if(0 == decoder)
-		return 0;
-
-	FLAC__stream_decoder_set_md5_checking(decoder, false);
-	FLAC__stream_decoder_set_metadata_ignore_all(decoder);
-	FLAC__stream_decoder_set_metadata_respond(decoder, type);
-
-	if(FLAC__stream_decoder_init_file(decoder, filename, write_callback_, metadata_callback_, error_callback_, &cd) != FLAC__STREAM_DECODER_INIT_STATUS_OK || cd.got_error) {
-		(void)FLAC__stream_decoder_finish(decoder);
-		FLAC__stream_decoder_delete(decoder);
-		return 0;
-	}
-
-	if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder) || cd.got_error) {
-		(void)FLAC__stream_decoder_finish(decoder);
-		FLAC__stream_decoder_delete(decoder);
-		if(0 != cd.object)
-			FLAC__metadata_object_delete(cd.object);
-		return 0;
-	}
-
-	(void)FLAC__stream_decoder_finish(decoder);
-	FLAC__stream_decoder_delete(decoder);
-
-	return cd.object;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo)
-{
-	FLAC__StreamMetadata *object;
-
-	FLAC__ASSERT(0 != filename);
-	FLAC__ASSERT(0 != streaminfo);
-
-	object = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_STREAMINFO);
-
-	if (object) {
-		/* can just copy the contents since STREAMINFO has no internal structure */
-		*streaminfo = *object;
-		FLAC__metadata_object_delete(object);
-		return true;
-	}
-	else {
-		return false;
-	}
-}
-
-FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags)
-{
-	FLAC__ASSERT(0 != filename);
-	FLAC__ASSERT(0 != tags);
-
-	*tags = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_VORBIS_COMMENT);
-
-	return 0 != *tags;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet)
-{
-	FLAC__ASSERT(0 != filename);
-	FLAC__ASSERT(0 != cuesheet);
-
-	*cuesheet = get_one_metadata_block_(filename, FLAC__METADATA_TYPE_CUESHEET);
-
-	return 0 != *cuesheet;
-}
-
-FLAC__StreamDecoderWriteStatus write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
-{
-	(void)decoder, (void)frame, (void)buffer, (void)client_data;
-
-	return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
-}
-
-void metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
-{
-	level0_client_data *cd = (level0_client_data *)client_data;
-	(void)decoder;
-
-	/*
-	 * we assume we only get here when the one metadata block we were
-	 * looking for was passed to us
-	 */
-	if(!cd->got_error && 0 == cd->object) {
-		if(0 == (cd->object = FLAC__metadata_object_clone(metadata)))
-			cd->got_error = true;
-	}
-}
-
-void error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
-{
-	level0_client_data *cd = (level0_client_data *)client_data;
-	(void)decoder;
-
-	if(status != FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC)
-		cd->got_error = true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors)
-{
-	FLAC__Metadata_SimpleIterator *it;
-	FLAC__uint64 max_area_seen = 0;
-	FLAC__uint64 max_depth_seen = 0;
-
-	FLAC__ASSERT(0 != filename);
-	FLAC__ASSERT(0 != picture);
-
-	*picture = 0;
-
-	it = FLAC__metadata_simple_iterator_new();
-	if(0 == it)
-		return false;
-	if(!FLAC__metadata_simple_iterator_init(it, filename, /*read_only=*/true, /*preserve_file_stats=*/true)) {
-		FLAC__metadata_simple_iterator_delete(it);
-		return false;
-	}
-	do {
-		if(FLAC__metadata_simple_iterator_get_block_type(it) == FLAC__METADATA_TYPE_PICTURE) {
-			FLAC__StreamMetadata *obj = FLAC__metadata_simple_iterator_get_block(it);
-			FLAC__uint64 area = (FLAC__uint64)obj->data.picture.width * (FLAC__uint64)obj->data.picture.height;
-			/* check constraints */
-			if(
-				(type == (FLAC__StreamMetadata_Picture_Type)(-1) || type == obj->data.picture.type) &&
-				(mime_type == 0 || !strcmp(mime_type, obj->data.picture.mime_type)) &&
-				(description == 0 || !strcmp((const char *)description, (const char *)obj->data.picture.description)) &&
-				obj->data.picture.width <= max_width &&
-				obj->data.picture.height <= max_height &&
-				obj->data.picture.depth <= max_depth &&
-				obj->data.picture.colors <= max_colors &&
-				(area > max_area_seen || (area == max_area_seen && obj->data.picture.depth > max_depth_seen))
-			) {
-				if(*picture)
-					FLAC__metadata_object_delete(*picture);
-				*picture = obj;
-				max_area_seen = area;
-				max_depth_seen = obj->data.picture.depth;
-			}
-			else {
-				FLAC__metadata_object_delete(obj);
-			}
-		}
-	} while(FLAC__metadata_simple_iterator_next(it));
-
-	FLAC__metadata_simple_iterator_delete(it);
-
-	return (0 != *picture);
-}
-
-
-/****************************************************************************
- *
- * Level 1 implementation
- *
- ***************************************************************************/
-
-#define SIMPLE_ITERATOR_MAX_PUSH_DEPTH (1+4)
-/* 1 for initial offset, +4 for our own personal use */
-
-struct FLAC__Metadata_SimpleIterator {
-	FILE *file;
-	char *filename, *tempfile_path_prefix;
-	struct stat stats;
-	FLAC__bool has_stats;
-	FLAC__bool is_writable;
-	FLAC__Metadata_SimpleIteratorStatus status;
-	off_t offset[SIMPLE_ITERATOR_MAX_PUSH_DEPTH];
-	off_t first_offset; /* this is the offset to the STREAMINFO block */
-	unsigned depth;
-	/* this is the metadata block header of the current block we are pointing to: */
-	FLAC__bool is_last;
-	FLAC__MetadataType type;
-	unsigned length;
-};
-
-FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[] = {
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR",
-	"FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR"
-};
-
-
-FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void)
-{
-	FLAC__Metadata_SimpleIterator *iterator = (FLAC__Metadata_SimpleIterator*)calloc(1, sizeof(FLAC__Metadata_SimpleIterator));
-
-	if(0 != iterator) {
-		iterator->file = 0;
-		iterator->filename = 0;
-		iterator->tempfile_path_prefix = 0;
-		iterator->has_stats = false;
-		iterator->is_writable = false;
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-		iterator->first_offset = iterator->offset[0] = -1;
-		iterator->depth = 0;
-	}
-
-	return iterator;
-}
-
-static void simple_iterator_free_guts_(FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-
-	if(0 != iterator->file) {
-		fclose(iterator->file);
-		iterator->file = 0;
-		if(iterator->has_stats)
-			set_file_stats_(iterator->filename, &iterator->stats);
-	}
-	if(0 != iterator->filename) {
-		free(iterator->filename);
-		iterator->filename = 0;
-	}
-	if(0 != iterator->tempfile_path_prefix) {
-		free(iterator->tempfile_path_prefix);
-		iterator->tempfile_path_prefix = 0;
-	}
-}
-
-FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-
-	simple_iterator_free_guts_(iterator);
-	free(iterator);
-}
-
-FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__Metadata_SimpleIteratorStatus status;
-
-	FLAC__ASSERT(0 != iterator);
-
-	status = iterator->status;
-	iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-	return status;
-}
-
-static FLAC__bool simple_iterator_prime_input_(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool read_only)
-{
-	unsigned ret;
-
-	FLAC__ASSERT(0 != iterator);
-
-	if(read_only || 0 == (iterator->file = fopen(iterator->filename, "r+b"))) {
-		iterator->is_writable = false;
-		if(read_only || errno == EACCES) {
-			if(0 == (iterator->file = fopen(iterator->filename, "rb"))) {
-				iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE;
-				return false;
-			}
-		}
-		else {
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE;
-			return false;
-		}
-	}
-	else {
-		iterator->is_writable = true;
-	}
-
-	ret = seek_to_first_metadata_block_(iterator->file);
-	switch(ret) {
-		case 0:
-			iterator->depth = 0;
-			iterator->first_offset = iterator->offset[iterator->depth] = ftello(iterator->file);
-			return read_metadata_block_header_(iterator);
-		case 1:
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-			return false;
-		case 2:
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-			return false;
-		case 3:
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE;
-			return false;
-		default:
-			FLAC__ASSERT(0);
-			return false;
-	}
-}
-
-#if 0
-@@@ If we decide to finish implementing this, put this comment back in metadata.h
-/*
- * The 'tempfile_path_prefix' allows you to specify a directory where
- * tempfiles should go.  Remember that if your metadata edits cause the
- * FLAC file to grow, the entire file will have to be rewritten.  If
- * 'tempfile_path_prefix' is NULL, the temp file will be written in the
- * same directory as the original FLAC file.  This makes replacing the
- * original with the tempfile fast but requires extra space in the same
- * partition for the tempfile.  If space is a problem, you can pass a
- * directory name belonging to a different partition in
- * 'tempfile_path_prefix'.  Note that you should use the forward slash
- * '/' as the directory separator.  A trailing slash is not needed; it
- * will be added automatically.
- */
-FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool preserve_file_stats, const char *tempfile_path_prefix);
-#endif
-
-FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats)
-{
-	const char *tempfile_path_prefix = 0; /*@@@ search for comments near 'rename(...)' for what it will take to finish implementing this */
-
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != filename);
-
-	simple_iterator_free_guts_(iterator);
-
-	if(!read_only && preserve_file_stats)
-		iterator->has_stats = get_file_stats_(filename, &iterator->stats);
-
-	if(0 == (iterator->filename = strdup(filename))) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-		return false;
-	}
-	if(0 != tempfile_path_prefix && 0 == (iterator->tempfile_path_prefix = strdup(tempfile_path_prefix))) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-		return false;
-	}
-
-	return simple_iterator_prime_input_(iterator, read_only);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	return iterator->is_writable;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	if(iterator->is_last)
-		return false;
-
-	if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	iterator->offset[iterator->depth] = ftello(iterator->file);
-
-	return read_metadata_block_header_(iterator);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator)
-{
-	off_t this_offset;
-
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	if(iterator->offset[iterator->depth] == iterator->first_offset)
-		return false;
-
-	if(0 != fseeko(iterator->file, iterator->first_offset, SEEK_SET)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-	this_offset = iterator->first_offset;
-	if(!read_metadata_block_header_(iterator))
-		return false;
-
-	/* we ignore any error from ftello() and catch it in fseeko() */
-	while(ftello(iterator->file) + (off_t)iterator->length < iterator->offset[iterator->depth]) {
-		if(0 != fseeko(iterator->file, iterator->length, SEEK_CUR)) {
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-			return false;
-		}
-		this_offset = ftello(iterator->file);
-		if(!read_metadata_block_header_(iterator))
-			return false;
-	}
-
-	iterator->offset[iterator->depth] = this_offset;
-
-	return true;
-}
-
-/*@@@@add to tests*/
-FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	return iterator->is_last;
-}
-
-/*@@@@add to tests*/
-FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	return iterator->offset[iterator->depth];
-}
-
-FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	return iterator->type;
-}
-
-/*@@@@add to tests*/
-FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	return iterator->length;
-}
-
-/*@@@@add to tests*/
-FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id)
-{
-	const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8;
-
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-	FLAC__ASSERT(0 != id);
-
-	if(iterator->type != FLAC__METADATA_TYPE_APPLICATION) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT;
-		return false;
-	}
-
-	if(fread(id, 1, id_bytes, iterator->file) != id_bytes) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-		return false;
-	}
-
-	/* back up */
-	if(0 != fseeko(iterator->file, -((int)id_bytes), SEEK_CUR)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	return true;
-}
-
-FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__StreamMetadata *block = FLAC__metadata_object_new(iterator->type);
-
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	if(0 != block) {
-		block->is_last = iterator->is_last;
-		block->length = iterator->length;
-
-		if(!read_metadata_block_data_(iterator, block)) {
-			FLAC__metadata_object_delete(block);
-			return 0;
-		}
-
-		/* back up to the beginning of the block data to stay consistent */
-		if(0 != fseeko(iterator->file, iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH, SEEK_SET)) {
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-			FLAC__metadata_object_delete(block);
-			return 0;
-		}
-	}
-	else
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-	return block;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding)
-{
-	FLAC__ASSERT_DECLARATION(off_t debug_target_offset = iterator->offset[iterator->depth];)
-	FLAC__bool ret;
-
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-	FLAC__ASSERT(0 != block);
-
-	if(!iterator->is_writable) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE;
-		return false;
-	}
-
-	if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO || block->type == FLAC__METADATA_TYPE_STREAMINFO) {
-		if(iterator->type != block->type) {
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT;
-			return false;
-		}
-	}
-
-	block->is_last = iterator->is_last;
-
-	if(iterator->length == block->length)
-		return write_metadata_block_stationary_(iterator, block);
-	else if(iterator->length > block->length) {
-		if(use_padding && iterator->length >= FLAC__STREAM_METADATA_HEADER_LENGTH + block->length) {
-			ret = write_metadata_block_stationary_with_padding_(iterator, block, iterator->length - FLAC__STREAM_METADATA_HEADER_LENGTH - block->length, block->is_last);
-			FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
-			FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
-			return ret;
-		}
-		else {
-			ret = rewrite_whole_file_(iterator, block, /*append=*/false);
-			FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
-			FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
-			return ret;
-		}
-	}
-	else /* iterator->length < block->length */ {
-		unsigned padding_leftover = 0;
-		FLAC__bool padding_is_last = false;
-		if(use_padding) {
-			/* first see if we can even use padding */
-			if(iterator->is_last) {
-				use_padding = false;
-			}
-			else {
-				const unsigned extra_padding_bytes_required = block->length - iterator->length;
-				simple_iterator_push_(iterator);
-				if(!FLAC__metadata_simple_iterator_next(iterator)) {
-					(void)simple_iterator_pop_(iterator);
-					return false;
-				}
-				if(iterator->type != FLAC__METADATA_TYPE_PADDING) {
-					use_padding = false;
-				}
-				else {
-					if(FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length == extra_padding_bytes_required) {
-						padding_leftover = 0;
-						block->is_last = iterator->is_last;
-					}
-					else if(iterator->length < extra_padding_bytes_required)
-						use_padding = false;
-					else {
-						padding_leftover = FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length - extra_padding_bytes_required;
-						padding_is_last = iterator->is_last;
-						block->is_last = false;
-					}
-				}
-				if(!simple_iterator_pop_(iterator))
-					return false;
-			}
-		}
-		if(use_padding) {
-			if(padding_leftover == 0) {
-				ret = write_metadata_block_stationary_(iterator, block);
-				FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
-				FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
-				return ret;
-			}
-			else {
-				FLAC__ASSERT(padding_leftover >= FLAC__STREAM_METADATA_HEADER_LENGTH);
-				ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last);
-				FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
-				FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
-				return ret;
-			}
-		}
-		else {
-			ret = rewrite_whole_file_(iterator, block, /*append=*/false);
-			FLAC__ASSERT(!ret || iterator->offset[iterator->depth] == debug_target_offset);
-			FLAC__ASSERT(!ret || ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
-			return ret;
-		}
-	}
-}
-
-FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding)
-{
-	unsigned padding_leftover = 0;
-	FLAC__bool padding_is_last = false;
-
-	FLAC__ASSERT_DECLARATION(off_t debug_target_offset = iterator->offset[iterator->depth] + FLAC__STREAM_METADATA_HEADER_LENGTH + iterator->length;)
-	FLAC__bool ret;
-
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-	FLAC__ASSERT(0 != block);
-
-	if(!iterator->is_writable)
-		return false;
-
-	if(block->type == FLAC__METADATA_TYPE_STREAMINFO) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT;
-		return false;
-	}
-
-	block->is_last = iterator->is_last;
-
-	if(use_padding) {
-		/* first see if we can even use padding */
-		if(iterator->is_last) {
-			use_padding = false;
-		}
-		else {
-			simple_iterator_push_(iterator);
-			if(!FLAC__metadata_simple_iterator_next(iterator)) {
-				(void)simple_iterator_pop_(iterator);
-				return false;
-			}
-			if(iterator->type != FLAC__METADATA_TYPE_PADDING) {
-				use_padding = false;
-			}
-			else {
-				if(iterator->length == block->length) {
-					padding_leftover = 0;
-					block->is_last = iterator->is_last;
-				}
-				else if(iterator->length < FLAC__STREAM_METADATA_HEADER_LENGTH + block->length)
-					use_padding = false;
-				else {
-					padding_leftover = iterator->length - block->length;
-					padding_is_last = iterator->is_last;
-					block->is_last = false;
-				}
-			}
-			if(!simple_iterator_pop_(iterator))
-				return false;
-		}
-	}
-	if(use_padding) {
-		/* move to the next block, which is suitable padding */
-		if(!FLAC__metadata_simple_iterator_next(iterator))
-			return false;
-		if(padding_leftover == 0) {
-			ret = write_metadata_block_stationary_(iterator, block);
-			FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
-			FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
-			return ret;
-		}
-		else {
-			FLAC__ASSERT(padding_leftover >= FLAC__STREAM_METADATA_HEADER_LENGTH);
-			ret = write_metadata_block_stationary_with_padding_(iterator, block, padding_leftover - FLAC__STREAM_METADATA_HEADER_LENGTH, padding_is_last);
-			FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
-			FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
-			return ret;
-		}
-	}
-	else {
-		ret = rewrite_whole_file_(iterator, block, /*append=*/true);
-		FLAC__ASSERT(iterator->offset[iterator->depth] == debug_target_offset);
-		FLAC__ASSERT(ftello(iterator->file) == debug_target_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH);
-		return ret;
-	}
-}
-
-FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding)
-{
-	FLAC__ASSERT_DECLARATION(off_t debug_target_offset = iterator->offset[iterator->depth];)
-	FLAC__bool ret;
-
-	if(iterator->type == FLAC__METADATA_TYPE_STREAMINFO) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT;
-		return false;
-	}
-
-	if(use_padding) {
-		FLAC__StreamMetadata *padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING);
-		if(0 == padding) {
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-			return false;
-		}
-		padding->length = iterator->length;
-		if(!FLAC__metadata_simple_iterator_set_block(iterator, padding, false)) {
-			FLAC__metadata_object_delete(padding);
-			return false;
-		}
-		FLAC__metadata_object_delete(padding);
-		if(!FLAC__metadata_simple_iterator_prev(iterator))
-			return false;
-		FLAC__ASSERT(iterator->offset[iterator->depth] + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length == debug_target_offset);
-		FLAC__ASSERT(ftello(iterator->file) + (off_t)iterator->length == debug_target_offset);
-		return true;
-	}
-	else {
-		ret = rewrite_whole_file_(iterator, 0, /*append=*/false);
-		FLAC__ASSERT(iterator->offset[iterator->depth] + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length == debug_target_offset);
-		FLAC__ASSERT(ftello(iterator->file) + (off_t)iterator->length == debug_target_offset);
-		return ret;
-	}
-}
-
-
-
-/****************************************************************************
- *
- * Level 2 implementation
- *
- ***************************************************************************/
-
-
-typedef struct FLAC__Metadata_Node {
-	FLAC__StreamMetadata *data;
-	struct FLAC__Metadata_Node *prev, *next;
-} FLAC__Metadata_Node;
-
-struct FLAC__Metadata_Chain {
-	char *filename; /* will be NULL if using callbacks */
-	FLAC__bool is_ogg;
-	FLAC__Metadata_Node *head;
-	FLAC__Metadata_Node *tail;
-	unsigned nodes;
-	FLAC__Metadata_ChainStatus status;
-	off_t first_offset, last_offset;
-	/*
-	 * This is the length of the chain initially read from the FLAC file.
-	 * it is used to compare against the current length to decide whether
-	 * or not the whole file has to be rewritten.
-	 */
-	off_t initial_length;
-	/* @@@ hacky, these are currently only needed by ogg reader */
-	FLAC__IOHandle handle;
-	FLAC__IOCallback_Read read_cb;
-};
-
-struct FLAC__Metadata_Iterator {
-	FLAC__Metadata_Chain *chain;
-	FLAC__Metadata_Node *current;
-};
-
-FLAC_API const char * const FLAC__Metadata_ChainStatusString[] = {
-	"FLAC__METADATA_CHAIN_STATUS_OK",
-	"FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT",
-	"FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE",
-	"FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE",
-	"FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE",
-	"FLAC__METADATA_CHAIN_STATUS_BAD_METADATA",
-	"FLAC__METADATA_CHAIN_STATUS_READ_ERROR",
-	"FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR",
-	"FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR",
-	"FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR",
-	"FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR",
-	"FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR",
-	"FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR",
-	"FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS",
-	"FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH",
-	"FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL"
-};
-
-
-static FLAC__Metadata_Node *node_new_(void)
-{
-	return (FLAC__Metadata_Node*)calloc(1, sizeof(FLAC__Metadata_Node));
-}
-
-static void node_delete_(FLAC__Metadata_Node *node)
-{
-	FLAC__ASSERT(0 != node);
-	if(0 != node->data)
-		FLAC__metadata_object_delete(node->data);
-	free(node);
-}
-
-static void chain_init_(FLAC__Metadata_Chain *chain)
-{
-	FLAC__ASSERT(0 != chain);
-
-	chain->filename = 0;
-	chain->is_ogg = false;
-	chain->head = chain->tail = 0;
-	chain->nodes = 0;
-	chain->status = FLAC__METADATA_CHAIN_STATUS_OK;
-	chain->initial_length = 0;
-	chain->read_cb = 0;
-}
-
-static void chain_clear_(FLAC__Metadata_Chain *chain)
-{
-	FLAC__Metadata_Node *node, *next;
-
-	FLAC__ASSERT(0 != chain);
-
-	for(node = chain->head; node; ) {
-		next = node->next;
-		node_delete_(node);
-		node = next;
-	}
-
-	if(0 != chain->filename)
-		free(chain->filename);
-
-	chain_init_(chain);
-}
-
-static void chain_append_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node)
-{
-	FLAC__ASSERT(0 != chain);
-	FLAC__ASSERT(0 != node);
-	FLAC__ASSERT(0 != node->data);
-
-	node->next = node->prev = 0;
-	node->data->is_last = true;
-	if(0 != chain->tail)
-		chain->tail->data->is_last = false;
-
-	if(0 == chain->head)
-		chain->head = node;
-	else {
-		FLAC__ASSERT(0 != chain->tail);
-		chain->tail->next = node;
-		node->prev = chain->tail;
-	}
-	chain->tail = node;
-	chain->nodes++;
-}
-
-static void chain_remove_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node)
-{
-	FLAC__ASSERT(0 != chain);
-	FLAC__ASSERT(0 != node);
-
-	if(node == chain->head)
-		chain->head = node->next;
-	else
-		node->prev->next = node->next;
-
-	if(node == chain->tail)
-		chain->tail = node->prev;
-	else
-		node->next->prev = node->prev;
-
-	if(0 != chain->tail)
-		chain->tail->data->is_last = true;
-
-	chain->nodes--;
-}
-
-static void chain_delete_node_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node)
-{
-	chain_remove_node_(chain, node);
-	node_delete_(node);
-}
-
-static off_t chain_calculate_length_(FLAC__Metadata_Chain *chain)
-{
-	const FLAC__Metadata_Node *node;
-	off_t length = 0;
-	for(node = chain->head; node; node = node->next)
-		length += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length);
-	return length;
-}
-
-static void iterator_insert_node_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node)
-{
-	FLAC__ASSERT(0 != node);
-	FLAC__ASSERT(0 != node->data);
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->current);
-	FLAC__ASSERT(0 != iterator->chain);
-	FLAC__ASSERT(0 != iterator->chain->head);
-	FLAC__ASSERT(0 != iterator->chain->tail);
-
-	node->data->is_last = false;
-
-	node->prev = iterator->current->prev;
-	node->next = iterator->current;
-
-	if(0 == node->prev)
-		iterator->chain->head = node;
-	else
-		node->prev->next = node;
-
-	iterator->current->prev = node;
-
-	iterator->chain->nodes++;
-}
-
-static void iterator_insert_node_after_(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Node *node)
-{
-	FLAC__ASSERT(0 != node);
-	FLAC__ASSERT(0 != node->data);
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->current);
-	FLAC__ASSERT(0 != iterator->chain);
-	FLAC__ASSERT(0 != iterator->chain->head);
-	FLAC__ASSERT(0 != iterator->chain->tail);
-
-	iterator->current->data->is_last = false;
-
-	node->prev = iterator->current;
-	node->next = iterator->current->next;
-
-	if(0 == node->next)
-		iterator->chain->tail = node;
-	else
-		node->next->prev = node;
-
-	node->prev->next = node;
-
-	iterator->chain->tail->data->is_last = true;
-
-	iterator->chain->nodes++;
-}
-
-/* return true iff node and node->next are both padding */
-static FLAC__bool chain_merge_adjacent_padding_(FLAC__Metadata_Chain *chain, FLAC__Metadata_Node *node)
-{
-	if(node->data->type == FLAC__METADATA_TYPE_PADDING && 0 != node->next && node->next->data->type == FLAC__METADATA_TYPE_PADDING) {
-		const unsigned growth = FLAC__STREAM_METADATA_HEADER_LENGTH + node->next->data->length;
-		node->data->length += growth;
-
-		chain_delete_node_(chain, node->next);
-		return true;
-	}
-	else
-		return false;
-}
-
-/* Returns the new length of the chain, or 0 if there was an error. */
-/* WATCHOUT: This can get called multiple times before a write, so
- * it should still work when this happens.
- */
-/* WATCHOUT: Make sure to also update the logic in
- * FLAC__metadata_chain_check_if_tempfile_needed() if the logic here changes.
- */
-static off_t chain_prepare_for_write_(FLAC__Metadata_Chain *chain, FLAC__bool use_padding)
-{
-	off_t current_length = chain_calculate_length_(chain);
-
-	if(use_padding) {
-		/* if the metadata shrank and the last block is padding, we just extend the last padding block */
-		if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) {
-			const off_t delta = chain->initial_length - current_length;
-			chain->tail->data->length += delta;
-			current_length += delta;
-			FLAC__ASSERT(current_length == chain->initial_length);
-		}
-		/* if the metadata shrank more than 4 bytes then there's room to add another padding block */
-		else if(current_length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length) {
-			FLAC__StreamMetadata *padding;
-			FLAC__Metadata_Node *node;
-			if(0 == (padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING))) {
-				chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
-				return 0;
-			}
-			padding->length = chain->initial_length - (FLAC__STREAM_METADATA_HEADER_LENGTH + current_length);
-			if(0 == (node = node_new_())) {
-				FLAC__metadata_object_delete(padding);
-				chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
-				return 0;
-			}
-			node->data = padding;
-			chain_append_node_(chain, node);
-			current_length = chain_calculate_length_(chain);
-			FLAC__ASSERT(current_length == chain->initial_length);
-		}
-		/* if the metadata grew but the last block is padding, try cutting the padding to restore the original length so we don't have to rewrite the whole file */
-		else if(current_length > chain->initial_length) {
-			const off_t delta = current_length - chain->initial_length;
-			if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) {
-				/* if the delta is exactly the size of the last padding block, remove the padding block */
-				if((off_t)chain->tail->data->length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta) {
-					chain_delete_node_(chain, chain->tail);
-					current_length = chain_calculate_length_(chain);
-					FLAC__ASSERT(current_length == chain->initial_length);
-				}
-				/* if there is at least 'delta' bytes of padding, trim the padding down */
-				else if((off_t)chain->tail->data->length >= delta) {
-					chain->tail->data->length -= delta;
-					current_length -= delta;
-					FLAC__ASSERT(current_length == chain->initial_length);
-				}
-			}
-		}
-	}
-
-	return current_length;
-}
-
-static FLAC__bool chain_read_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Tell tell_cb)
-{
-	FLAC__Metadata_Node *node;
-
-	FLAC__ASSERT(0 != chain);
-
-	/* we assume we're already at the beginning of the file */
-
-	switch(seek_to_first_metadata_block_cb_(handle, read_cb, seek_cb)) {
-		case 0:
-			break;
-		case 1:
-			chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR;
-			return false;
-		case 2:
-			chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
-			return false;
-		case 3:
-			chain->status = FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE;
-			return false;
-		default:
-			FLAC__ASSERT(0);
-			return false;
-	}
-
-	{
-		FLAC__int64 pos = tell_cb(handle);
-		if(pos < 0) {
-			chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR;
-			return false;
-		}
-		chain->first_offset = (off_t)pos;
-	}
-
-	{
-		FLAC__bool is_last;
-		FLAC__MetadataType type;
-		unsigned length;
-
-		do {
-			node = node_new_();
-			if(0 == node) {
-				chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
-				return false;
-			}
-
-			if(!read_metadata_block_header_cb_(handle, read_cb, &is_last, &type, &length)) {
-				node_delete_(node);
-				chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR;
-				return false;
-			}
-
-			node->data = FLAC__metadata_object_new(type);
-			if(0 == node->data) {
-				node_delete_(node);
-				chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
-				return false;
-			}
-
-			node->data->is_last = is_last;
-			node->data->length = length;
-
-			chain->status = get_equivalent_status_(read_metadata_block_data_cb_(handle, read_cb, seek_cb, node->data));
-			if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) {
-				node_delete_(node);
-				return false;
-			}
-			chain_append_node_(chain, node);
-		} while(!is_last);
-	}
-
-	{
-		FLAC__int64 pos = tell_cb(handle);
-		if(pos < 0) {
-			chain->status = FLAC__METADATA_CHAIN_STATUS_READ_ERROR;
-			return false;
-		}
-		chain->last_offset = (off_t)pos;
-	}
-
-	chain->initial_length = chain_calculate_length_(chain);
-
-	return true;
-}
-
-static FLAC__StreamDecoderReadStatus chain_read_ogg_read_cb_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data)
-{
-	FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data;
-	(void)decoder;
-	if(*bytes > 0 && chain->status == FLAC__METADATA_CHAIN_STATUS_OK) {
-		*bytes = chain->read_cb(buffer, sizeof(FLAC__byte), *bytes, chain->handle);
-		if(*bytes == 0)
-			return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
-		else
-			return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
-	}
-	else
-		return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
-}
-
-static FLAC__StreamDecoderWriteStatus chain_read_ogg_write_cb_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
-{
-	(void)decoder, (void)frame, (void)buffer, (void)client_data;
-	return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
-}
-
-static void chain_read_ogg_metadata_cb_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
-{
-	FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data;
-	FLAC__Metadata_Node *node;
-
-	(void)decoder;
-
-	node = node_new_();
-	if(0 == node) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
-		return;
-	}
-
-	node->data = FLAC__metadata_object_clone(metadata);
-	if(0 == node->data) {
-		node_delete_(node);
-		chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
-		return;
-	}
-
-	chain_append_node_(chain, node);
-}
-
-static void chain_read_ogg_error_cb_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
-{
-	FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)client_data;
-	(void)decoder, (void)status;
-	chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */
-}
-
-static FLAC__bool chain_read_ogg_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb)
-{
-	FLAC__StreamDecoder *decoder;
-
-	FLAC__ASSERT(0 != chain);
-
-	/* we assume we're already at the beginning of the file */
-
-	chain->handle = handle;
-	chain->read_cb = read_cb;
-	if(0 == (decoder = FLAC__stream_decoder_new())) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
-		return false;
-	}
-	FLAC__stream_decoder_set_metadata_respond_all(decoder);
-	if(FLAC__stream_decoder_init_ogg_stream(decoder, chain_read_ogg_read_cb_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, chain_read_ogg_write_cb_, chain_read_ogg_metadata_cb_, chain_read_ogg_error_cb_, chain) != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
-		FLAC__stream_decoder_delete(decoder);
-		chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */
-		return false;
-	}
-
-	chain->first_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */
-
-	if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder))
-		chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR; /*@@@ maybe needs better error code */
-	if(chain->status != FLAC__METADATA_CHAIN_STATUS_OK) {
-		FLAC__stream_decoder_delete(decoder);
-		return false;
-	}
-
-	FLAC__stream_decoder_delete(decoder);
-
-	chain->last_offset = 0; /*@@@ wrong; will need to be set correctly to implement metadata writing for Ogg FLAC */
-
-	chain->initial_length = chain_calculate_length_(chain);
-
-	return true;
-}
-
-static FLAC__bool chain_rewrite_metadata_in_place_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, FLAC__IOCallback_Seek seek_cb)
-{
-	FLAC__Metadata_Node *node;
-
-	FLAC__ASSERT(0 != chain);
-	FLAC__ASSERT(0 != chain->head);
-
-	if(0 != seek_cb(handle, chain->first_offset, SEEK_SET)) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	for(node = chain->head; node; node = node->next) {
-		if(!write_metadata_block_header_cb_(handle, write_cb, node->data)) {
-			chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR;
-			return false;
-		}
-		if(!write_metadata_block_data_cb_(handle, write_cb, node->data)) {
-			chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR;
-			return false;
-		}
-	}
-
-	/*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/
-
-	chain->status = FLAC__METADATA_CHAIN_STATUS_OK;
-	return true;
-}
-
-static FLAC__bool chain_rewrite_metadata_in_place_(FLAC__Metadata_Chain *chain)
-{
-	FILE *file;
-	FLAC__bool ret;
-
-	FLAC__ASSERT(0 != chain->filename);
-
-	if(0 == (file = fopen(chain->filename, "r+b"))) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
-		return false;
-	}
-
-	/* chain_rewrite_metadata_in_place_cb_() sets chain->status for us */
-	ret = chain_rewrite_metadata_in_place_cb_(chain, (FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, fseek_wrapper_);
-
-	fclose(file);
-
-	return ret;
-}
-
-static FLAC__bool chain_rewrite_file_(FLAC__Metadata_Chain *chain, const char *tempfile_path_prefix)
-{
-	FILE *f, *tempfile;
-	char *tempfilename;
-	FLAC__Metadata_SimpleIteratorStatus status;
-	const FLAC__Metadata_Node *node;
-
-	FLAC__ASSERT(0 != chain);
-	FLAC__ASSERT(0 != chain->filename);
-	FLAC__ASSERT(0 != chain->head);
-
-	/* copy the file prefix (data up to first metadata block */
-	if(0 == (f = fopen(chain->filename, "rb"))) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
-		return false;
-	}
-	if(!open_tempfile_(chain->filename, tempfile_path_prefix, &tempfile, &tempfilename, &status)) {
-		chain->status = get_equivalent_status_(status);
-		cleanup_tempfile_(&tempfile, &tempfilename);
-		return false;
-	}
-	if(!copy_n_bytes_from_file_(f, tempfile, chain->first_offset, &status)) {
-		chain->status = get_equivalent_status_(status);
-		cleanup_tempfile_(&tempfile, &tempfilename);
-		return false;
-	}
-
-	/* write the metadata */
-	for(node = chain->head; node; node = node->next) {
-		if(!write_metadata_block_header_(tempfile, &status, node->data)) {
-			chain->status = get_equivalent_status_(status);
-			return false;
-		}
-		if(!write_metadata_block_data_(tempfile, &status, node->data)) {
-			chain->status = get_equivalent_status_(status);
-			return false;
-		}
-	}
-	/*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/
-
-	/* copy the file postfix (everything after the metadata) */
-	if(0 != fseeko(f, chain->last_offset, SEEK_SET)) {
-		cleanup_tempfile_(&tempfile, &tempfilename);
-		chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
-		return false;
-	}
-	if(!copy_remaining_bytes_from_file_(f, tempfile, &status)) {
-		cleanup_tempfile_(&tempfile, &tempfilename);
-		chain->status = get_equivalent_status_(status);
-		return false;
-	}
-
-	/* move the tempfile on top of the original */
-	(void)fclose(f);
-	if(!transport_tempfile_(chain->filename, &tempfile, &tempfilename, &status))
-		return false;
-
-	return true;
-}
-
-/* assumes 'handle' is already at beginning of file */
-static FLAC__bool chain_rewrite_file_cb_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb)
-{
-	FLAC__Metadata_SimpleIteratorStatus status;
-	const FLAC__Metadata_Node *node;
-
-	FLAC__ASSERT(0 != chain);
-	FLAC__ASSERT(0 == chain->filename);
-	FLAC__ASSERT(0 != chain->head);
-
-	/* copy the file prefix (data up to first metadata block */
-	if(!copy_n_bytes_from_file_cb_(handle, read_cb, temp_handle, temp_write_cb, chain->first_offset, &status)) {
-		chain->status = get_equivalent_status_(status);
-		return false;
-	}
-
-	/* write the metadata */
-	for(node = chain->head; node; node = node->next) {
-		if(!write_metadata_block_header_cb_(temp_handle, temp_write_cb, node->data)) {
-			chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR;
-			return false;
-		}
-		if(!write_metadata_block_data_cb_(temp_handle, temp_write_cb, node->data)) {
-			chain->status = FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR;
-			return false;
-		}
-	}
-	/*FLAC__ASSERT(fflush(), ftello() == chain->last_offset);*/
-
-	/* copy the file postfix (everything after the metadata) */
-	if(0 != seek_cb(handle, chain->last_offset, SEEK_SET)) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
-		return false;
-	}
-	if(!copy_remaining_bytes_from_file_cb_(handle, read_cb, eof_cb, temp_handle, temp_write_cb, &status)) {
-		chain->status = get_equivalent_status_(status);
-		return false;
-	}
-
-	return true;
-}
-
-FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void)
-{
-	FLAC__Metadata_Chain *chain = (FLAC__Metadata_Chain*)calloc(1, sizeof(FLAC__Metadata_Chain));
-
-	if(0 != chain)
-		chain_init_(chain);
-
-	return chain;
-}
-
-FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain)
-{
-	FLAC__ASSERT(0 != chain);
-
-	chain_clear_(chain);
-
-	free(chain);
-}
-
-FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain)
-{
-	FLAC__Metadata_ChainStatus status;
-
-	FLAC__ASSERT(0 != chain);
-
-	status = chain->status;
-	chain->status = FLAC__METADATA_CHAIN_STATUS_OK;
-	return status;
-}
-
-static FLAC__bool chain_read_(FLAC__Metadata_Chain *chain, const char *filename, FLAC__bool is_ogg)
-{
-	FILE *file;
-	FLAC__bool ret;
-
-	FLAC__ASSERT(0 != chain);
-	FLAC__ASSERT(0 != filename);
-
-	chain_clear_(chain);
-
-	if(0 == (chain->filename = strdup(filename))) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
-		return false;
-	}
-
-	chain->is_ogg = is_ogg;
-
-	if(0 == (file = fopen(filename, "rb"))) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
-		return false;
-	}
-
-	/* the function also sets chain->status for us */
-	ret = is_ogg?
-		chain_read_ogg_cb_(chain, file, (FLAC__IOCallback_Read)fread) :
-		chain_read_cb_(chain, file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, ftell_wrapper_)
-	;
-
-	fclose(file);
-
-	return ret;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename)
-{
-	return chain_read_(chain, filename, /*is_ogg=*/false);
-}
-
-/*@@@@add to tests*/
-FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename)
-{
-	return chain_read_(chain, filename, /*is_ogg=*/true);
-}
-
-static FLAC__bool chain_read_with_callbacks_(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__bool is_ogg)
-{
-	FLAC__bool ret;
-
-	FLAC__ASSERT(0 != chain);
-
-	chain_clear_(chain);
-
-	if (0 == callbacks.read || 0 == callbacks.seek || 0 == callbacks.tell) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS;
-		return false;
-	}
-
-	chain->is_ogg = is_ogg;
-
-	/* rewind */
-	if(0 != callbacks.seek(handle, 0, SEEK_SET)) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	/* the function also sets chain->status for us */
-	ret = is_ogg?
-		chain_read_ogg_cb_(chain, handle, callbacks.read) :
-		chain_read_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.tell)
-	;
-
-	return ret;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks)
-{
-	return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/false);
-}
-
-/*@@@@add to tests*/
-FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks)
-{
-	return chain_read_with_callbacks_(chain, handle, callbacks, /*is_ogg=*/true);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding)
-{
-	/* This does all the same checks that are in chain_prepare_for_write_()
-	 * but doesn't actually alter the chain.  Make sure to update the logic
-	 * here if chain_prepare_for_write_() changes.
-	 */
-	const off_t current_length = chain_calculate_length_(chain);
-
-	FLAC__ASSERT(0 != chain);
-
-	if(use_padding) {
-		/* if the metadata shrank and the last block is padding, we just extend the last padding block */
-		if(current_length < chain->initial_length && chain->tail->data->type == FLAC__METADATA_TYPE_PADDING)
-			return false;
-		/* if the metadata shrank more than 4 bytes then there's room to add another padding block */
-		else if(current_length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH <= chain->initial_length)
-			return false;
-		/* if the metadata grew but the last block is padding, try cutting the padding to restore the original length so we don't have to rewrite the whole file */
-		else if(current_length > chain->initial_length) {
-			const off_t delta = current_length - chain->initial_length;
-			if(chain->tail->data->type == FLAC__METADATA_TYPE_PADDING) {
-				/* if the delta is exactly the size of the last padding block, remove the padding block */
-				if((off_t)chain->tail->data->length + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH == delta)
-					return false;
-				/* if there is at least 'delta' bytes of padding, trim the padding down */
-				else if((off_t)chain->tail->data->length >= delta)
-					return false;
-			}
-		}
-	}
-
-	return (current_length != chain->initial_length);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats)
-{
-	struct stat stats;
-	const char *tempfile_path_prefix = 0;
-	off_t current_length;
-
-	FLAC__ASSERT(0 != chain);
-
-	if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */
-		chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR;
-		return false;
-	}
-
-	if (0 == chain->filename) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH;
-		return false;
-	}
-
-	current_length = chain_prepare_for_write_(chain, use_padding);
-
-	/* a return value of 0 means there was an error; chain->status is already set */
-	if (0 == current_length)
-		return false;
-
-	if(preserve_file_stats)
-		get_file_stats_(chain->filename, &stats);
-
-	if(current_length == chain->initial_length) {
-		if(!chain_rewrite_metadata_in_place_(chain))
-			return false;
-	}
-	else {
-		if(!chain_rewrite_file_(chain, tempfile_path_prefix))
-			return false;
-
-		/* recompute lengths and offsets */
-		{
-			const FLAC__Metadata_Node *node;
-			chain->initial_length = current_length;
-			chain->last_offset = chain->first_offset;
-			for(node = chain->head; node; node = node->next)
-				chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length);
-		}
-	}
-
-	if(preserve_file_stats)
-		set_file_stats_(chain->filename, &stats);
-
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks)
-{
-	off_t current_length;
-
-	FLAC__ASSERT(0 != chain);
-
-	if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */
-		chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR;
-		return false;
-	}
-
-	if (0 != chain->filename) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH;
-		return false;
-	}
-
-	if (0 == callbacks.write || 0 == callbacks.seek) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS;
-		return false;
-	}
-
-	if (FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL;
-		return false;
-	}
-
-	current_length = chain_prepare_for_write_(chain, use_padding);
-
-	/* a return value of 0 means there was an error; chain->status is already set */
-	if (0 == current_length)
-		return false;
-
-	FLAC__ASSERT(current_length == chain->initial_length);
-
-	return chain_rewrite_metadata_in_place_cb_(chain, handle, callbacks.write, callbacks.seek);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks)
-{
-	off_t current_length;
-
-	FLAC__ASSERT(0 != chain);
-
-	if (chain->is_ogg) { /* cannot write back to Ogg FLAC yet */
-		chain->status = FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR;
-		return false;
-	}
-
-	if (0 != chain->filename) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH;
-		return false;
-	}
-
-	if (0 == callbacks.read || 0 == callbacks.seek || 0 == callbacks.eof) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS;
-		return false;
-	}
-	if (0 == temp_callbacks.write) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS;
-		return false;
-	}
-
-	if (!FLAC__metadata_chain_check_if_tempfile_needed(chain, use_padding)) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL;
-		return false;
-	}
-
-	current_length = chain_prepare_for_write_(chain, use_padding);
-
-	/* a return value of 0 means there was an error; chain->status is already set */
-	if (0 == current_length)
-		return false;
-
-	FLAC__ASSERT(current_length != chain->initial_length);
-
-	/* rewind */
-	if(0 != callbacks.seek(handle, 0, SEEK_SET)) {
-		chain->status = FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	if(!chain_rewrite_file_cb_(chain, handle, callbacks.read, callbacks.seek, callbacks.eof, temp_handle, temp_callbacks.write))
-		return false;
-
-	/* recompute lengths and offsets */
-	{
-		const FLAC__Metadata_Node *node;
-		chain->initial_length = current_length;
-		chain->last_offset = chain->first_offset;
-		for(node = chain->head; node; node = node->next)
-			chain->last_offset += (FLAC__STREAM_METADATA_HEADER_LENGTH + node->data->length);
-	}
-
-	return true;
-}
-
-FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain)
-{
-	FLAC__Metadata_Node *node;
-
-	FLAC__ASSERT(0 != chain);
-
-	for(node = chain->head; node; ) {
-		if(!chain_merge_adjacent_padding_(chain, node))
-			node = node->next;
-	}
-}
-
-FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain)
-{
-	FLAC__Metadata_Node *node, *save;
-	unsigned i;
-
-	FLAC__ASSERT(0 != chain);
-
-	/*
-	 * Don't try and be too smart... this simple algo is good enough for
-	 * the small number of nodes that we deal with.
-	 */
-	for(i = 0, node = chain->head; i < chain->nodes; i++) {
-		if(node->data->type == FLAC__METADATA_TYPE_PADDING) {
-			save = node->next;
-			chain_remove_node_(chain, node);
-			chain_append_node_(chain, node);
-			node = save;
-		}
-		else {
-			node = node->next;
-		}
-	}
-
-	FLAC__metadata_chain_merge_padding(chain);
-}
-
-
-FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void)
-{
-	FLAC__Metadata_Iterator *iterator = (FLAC__Metadata_Iterator*)calloc(1, sizeof(FLAC__Metadata_Iterator));
-
-	/* calloc() implies:
-		iterator->current = 0;
-		iterator->chain = 0;
-	*/
-
-	return iterator;
-}
-
-FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-
-	free(iterator);
-}
-
-FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != chain);
-	FLAC__ASSERT(0 != chain->head);
-
-	iterator->chain = chain;
-	iterator->current = chain->head;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-
-	if(0 == iterator->current || 0 == iterator->current->next)
-		return false;
-
-	iterator->current = iterator->current->next;
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-
-	if(0 == iterator->current || 0 == iterator->current->prev)
-		return false;
-
-	iterator->current = iterator->current->prev;
-	return true;
-}
-
-FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->current);
-	FLAC__ASSERT(0 != iterator->current->data);
-
-	return iterator->current->data->type;
-}
-
-FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->current);
-
-	return iterator->current->data;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != block);
-	return FLAC__metadata_iterator_delete_block(iterator, false) && FLAC__metadata_iterator_insert_block_after(iterator, block);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding)
-{
-	FLAC__Metadata_Node *save;
-
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->current);
-
-	if(0 == iterator->current->prev) {
-		FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO);
-		return false;
-	}
-
-	save = iterator->current->prev;
-
-	if(replace_with_padding) {
-		FLAC__metadata_object_delete_data(iterator->current->data);
-		iterator->current->data->type = FLAC__METADATA_TYPE_PADDING;
-	}
-	else {
-		chain_delete_node_(iterator->chain, iterator->current);
-	}
-
-	iterator->current = save;
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block)
-{
-	FLAC__Metadata_Node *node;
-
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->current);
-	FLAC__ASSERT(0 != block);
-
-	if(block->type == FLAC__METADATA_TYPE_STREAMINFO)
-		return false;
-
-	if(0 == iterator->current->prev) {
-		FLAC__ASSERT(iterator->current->data->type == FLAC__METADATA_TYPE_STREAMINFO);
-		return false;
-	}
-
-	if(0 == (node = node_new_()))
-		return false;
-
-	node->data = block;
-	iterator_insert_node_(iterator, node);
-	iterator->current = node;
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block)
-{
-	FLAC__Metadata_Node *node;
-
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->current);
-	FLAC__ASSERT(0 != block);
-
-	if(block->type == FLAC__METADATA_TYPE_STREAMINFO)
-		return false;
-
-	if(0 == (node = node_new_()))
-		return false;
-
-	node->data = block;
-	iterator_insert_node_after_(iterator, node);
-	iterator->current = node;
-	return true;
-}
-
-
-/****************************************************************************
- *
- * Local function definitions
- *
- ***************************************************************************/
-
-void pack_uint32_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes)
-{
-	unsigned i;
-
-	b += bytes;
-
-	for(i = 0; i < bytes; i++) {
-		*(--b) = (FLAC__byte)(val & 0xff);
-		val >>= 8;
-	}
-}
-
-void pack_uint32_little_endian_(FLAC__uint32 val, FLAC__byte *b, unsigned bytes)
-{
-	unsigned i;
-
-	for(i = 0; i < bytes; i++) {
-		*(b++) = (FLAC__byte)(val & 0xff);
-		val >>= 8;
-	}
-}
-
-void pack_uint64_(FLAC__uint64 val, FLAC__byte *b, unsigned bytes)
-{
-	unsigned i;
-
-	b += bytes;
-
-	for(i = 0; i < bytes; i++) {
-		*(--b) = (FLAC__byte)(val & 0xff);
-		val >>= 8;
-	}
-}
-
-FLAC__uint32 unpack_uint32_(FLAC__byte *b, unsigned bytes)
-{
-	FLAC__uint32 ret = 0;
-	unsigned i;
-
-	for(i = 0; i < bytes; i++)
-		ret = (ret << 8) | (FLAC__uint32)(*b++);
-
-	return ret;
-}
-
-FLAC__uint32 unpack_uint32_little_endian_(FLAC__byte *b, unsigned bytes)
-{
-	FLAC__uint32 ret = 0;
-	unsigned i;
-
-	b += bytes;
-
-	for(i = 0; i < bytes; i++)
-		ret = (ret << 8) | (FLAC__uint32)(*--b);
-
-	return ret;
-}
-
-FLAC__uint64 unpack_uint64_(FLAC__byte *b, unsigned bytes)
-{
-	FLAC__uint64 ret = 0;
-	unsigned i;
-
-	for(i = 0; i < bytes; i++)
-		ret = (ret << 8) | (FLAC__uint64)(*b++);
-
-	return ret;
-}
-
-FLAC__bool read_metadata_block_header_(FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	if(!read_metadata_block_header_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, &iterator->is_last, &iterator->type, &iterator->length)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-		return false;
-	}
-
-	return true;
-}
-
-FLAC__bool read_metadata_block_data_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block)
-{
-	FLAC__ASSERT(0 != iterator);
-	FLAC__ASSERT(0 != iterator->file);
-
-	iterator->status = read_metadata_block_data_cb_((FLAC__IOHandle)iterator->file, (FLAC__IOCallback_Read)fread, fseek_wrapper_, block);
-
-	return (iterator->status == FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK);
-}
-
-FLAC__bool read_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__bool *is_last, FLAC__MetadataType *type, unsigned *length)
-{
-	FLAC__byte raw_header[FLAC__STREAM_METADATA_HEADER_LENGTH];
-
-	if(read_cb(raw_header, 1, FLAC__STREAM_METADATA_HEADER_LENGTH, handle) != FLAC__STREAM_METADATA_HEADER_LENGTH)
-		return false;
-
-	*is_last = raw_header[0] & 0x80? true : false;
-	*type = (FLAC__MetadataType)(raw_header[0] & 0x7f);
-	*length = unpack_uint32_(raw_header + 1, 3);
-
-	/* Note that we don't check:
-	 *    if(iterator->type >= FLAC__METADATA_TYPE_UNDEFINED)
-	 * we just will read in an opaque block
-	 */
-
-	return true;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata *block)
-{
-	switch(block->type) {
-		case FLAC__METADATA_TYPE_STREAMINFO:
-			return read_metadata_block_data_streaminfo_cb_(handle, read_cb, &block->data.stream_info);
-		case FLAC__METADATA_TYPE_PADDING:
-			return read_metadata_block_data_padding_cb_(handle, seek_cb, &block->data.padding, block->length);
-		case FLAC__METADATA_TYPE_APPLICATION:
-			return read_metadata_block_data_application_cb_(handle, read_cb, &block->data.application, block->length);
-		case FLAC__METADATA_TYPE_SEEKTABLE:
-			return read_metadata_block_data_seektable_cb_(handle, read_cb, &block->data.seek_table, block->length);
-		case FLAC__METADATA_TYPE_VORBIS_COMMENT:
-			return read_metadata_block_data_vorbis_comment_cb_(handle, read_cb, &block->data.vorbis_comment);
-		case FLAC__METADATA_TYPE_CUESHEET:
-			return read_metadata_block_data_cuesheet_cb_(handle, read_cb, &block->data.cue_sheet);
-		case FLAC__METADATA_TYPE_PICTURE:
-			return read_metadata_block_data_picture_cb_(handle, read_cb, &block->data.picture);
-		default:
-			return read_metadata_block_data_unknown_cb_(handle, read_cb, &block->data.unknown, block->length);
-	}
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_StreamInfo *block)
-{
-	FLAC__byte buffer[FLAC__STREAM_METADATA_STREAMINFO_LENGTH], *b;
-
-	if(read_cb(buffer, 1, FLAC__STREAM_METADATA_STREAMINFO_LENGTH, handle) != FLAC__STREAM_METADATA_STREAMINFO_LENGTH)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-
-	b = buffer;
-
-	/* we are using hardcoded numbers for simplicity but we should
-	 * probably eventually write a bit-level unpacker and use the
-	 * _STREAMINFO_ constants.
-	 */
-	block->min_blocksize = unpack_uint32_(b, 2); b += 2;
-	block->max_blocksize = unpack_uint32_(b, 2); b += 2;
-	block->min_framesize = unpack_uint32_(b, 3); b += 3;
-	block->max_framesize = unpack_uint32_(b, 3); b += 3;
-	block->sample_rate = (unpack_uint32_(b, 2) << 4) | ((unsigned)(b[2] & 0xf0) >> 4);
-	block->channels = (unsigned)((b[2] & 0x0e) >> 1) + 1;
-	block->bits_per_sample = ((((unsigned)(b[2] & 0x01)) << 4) | (((unsigned)(b[3] & 0xf0)) >> 4)) + 1;
-	block->total_samples = (((FLAC__uint64)(b[3] & 0x0f)) << 32) | unpack_uint64_(b+4, 4);
-	memcpy(block->md5sum, b+8, 16);
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Seek seek_cb, FLAC__StreamMetadata_Padding *block, unsigned block_length)
-{
-	(void)block; /* nothing to do; we don't care about reading the padding bytes */
-
-	if(0 != seek_cb(handle, block_length, SEEK_CUR))
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Application *block, unsigned block_length)
-{
-	const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8;
-
-	if(read_cb(block->id, 1, id_bytes, handle) != id_bytes)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-
-	if(block_length < id_bytes)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-
-	block_length -= id_bytes;
-
-	if(block_length == 0) {
-		block->data = 0;
-	}
-	else {
-		if(0 == (block->data = (FLAC__byte*)malloc(block_length)))
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-		if(read_cb(block->data, 1, block_length, handle) != block_length)
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	}
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_SeekTable *block, unsigned block_length)
-{
-	unsigned i;
-	FLAC__byte buffer[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH];
-
-	FLAC__ASSERT(block_length % FLAC__STREAM_METADATA_SEEKPOINT_LENGTH == 0);
-
-	block->num_points = block_length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH;
-
-	if(block->num_points == 0)
-		block->points = 0;
-	else if(0 == (block->points = (FLAC__StreamMetadata_SeekPoint*)safe_malloc_mul_2op_(block->num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint))))
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-	for(i = 0; i < block->num_points; i++) {
-		if(read_cb(buffer, 1, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH, handle) != FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-		/* some MAGIC NUMBERs here */
-		block->points[i].sample_number = unpack_uint64_(buffer, 8);
-		block->points[i].stream_offset = unpack_uint64_(buffer+8, 8);
-		block->points[i].frame_samples = unpack_uint32_(buffer+16, 2);
-	}
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_entry_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment_Entry *entry)
-{
-	const unsigned entry_length_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8;
-	FLAC__byte buffer[4]; /* magic number is asserted below */
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8 == sizeof(buffer));
-
-	if(read_cb(buffer, 1, entry_length_len, handle) != entry_length_len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	entry->length = unpack_uint32_little_endian_(buffer, entry_length_len);
-
-	if(0 != entry->entry)
-		free(entry->entry);
-
-	if(entry->length == 0) {
-		entry->entry = 0;
-	}
-	else {
-		if(0 == (entry->entry = (FLAC__byte*)safe_malloc_add_2op_(entry->length, /*+*/1)))
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-		if(read_cb(entry->entry, 1, entry->length, handle) != entry->length)
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-
-		entry->entry[entry->length] = '\0';
-	}
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_VorbisComment *block)
-{
-	unsigned i;
-	FLAC__Metadata_SimpleIteratorStatus status;
-	const unsigned num_comments_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8;
-	FLAC__byte buffer[4]; /* magic number is asserted below */
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8 == sizeof(buffer));
-
-	if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_vorbis_comment_entry_cb_(handle, read_cb, &(block->vendor_string))))
-		return status;
-
-	if(read_cb(buffer, 1, num_comments_len, handle) != num_comments_len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	block->num_comments = unpack_uint32_little_endian_(buffer, num_comments_len);
-
-	if(block->num_comments == 0) {
-		block->comments = 0;
-	}
-	else if(0 == (block->comments = (FLAC__StreamMetadata_VorbisComment_Entry*)calloc(block->num_comments, sizeof(FLAC__StreamMetadata_VorbisComment_Entry))))
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-	for(i = 0; i < block->num_comments; i++) {
-		if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_vorbis_comment_entry_cb_(handle, read_cb, block->comments + i)))
-			return status;
-	}
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_track_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet_Track *track)
-{
-	unsigned i, len;
-	FLAC__byte buffer[32]; /* asserted below that this is big enough */
-
-	FLAC__ASSERT(sizeof(buffer) >= sizeof(FLAC__uint64));
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8);
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	track->offset = unpack_uint64_(buffer, len);
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	track->number = (FLAC__byte)unpack_uint32_(buffer, len);
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN / 8;
-	if(read_cb(track->isrc, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-
-	FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) % 8 == 0);
-	len = (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN == 1);
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN == 1);
-	track->type = buffer[0] >> 7;
-	track->pre_emphasis = (buffer[0] >> 6) & 1;
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	track->num_indices = (FLAC__byte)unpack_uint32_(buffer, len);
-
-	if(track->num_indices == 0) {
-		track->indices = 0;
-	}
-	else if(0 == (track->indices = (FLAC__StreamMetadata_CueSheet_Index*)calloc(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index))))
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-	for(i = 0; i < track->num_indices; i++) {
-		FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN % 8 == 0);
-		len = FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN / 8;
-		if(read_cb(buffer, 1, len, handle) != len)
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-		track->indices[i].offset = unpack_uint64_(buffer, len);
-
-		FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN % 8 == 0);
-		len = FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN / 8;
-		if(read_cb(buffer, 1, len, handle) != len)
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-		track->indices[i].number = (FLAC__byte)unpack_uint32_(buffer, len);
-
-		FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN % 8 == 0);
-		len = FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN / 8;
-		if(read_cb(buffer, 1, len, handle) != len)
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	}
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_CueSheet *block)
-{
-	unsigned i, len;
-	FLAC__Metadata_SimpleIteratorStatus status;
-	FLAC__byte buffer[1024]; /* MSVC needs a constant expression so we put a magic number and assert */
-
-	FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)/8 <= sizeof(buffer));
-	FLAC__ASSERT(sizeof(FLAC__uint64) <= sizeof(buffer));
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN / 8;
-	if(read_cb(block->media_catalog_number, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	block->lead_in = unpack_uint64_(buffer, len);
-
-	FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) % 8 == 0);
-	len = (FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	block->is_cd = buffer[0]&0x80? true : false;
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	block->num_tracks = unpack_uint32_(buffer, len);
-
-	if(block->num_tracks == 0) {
-		block->tracks = 0;
-	}
-	else if(0 == (block->tracks = (FLAC__StreamMetadata_CueSheet_Track*)calloc(block->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track))))
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-	for(i = 0; i < block->num_tracks; i++) {
-		if(FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK != (status = read_metadata_block_data_cuesheet_track_cb_(handle, read_cb, block->tracks + i)))
-			return status;
-	}
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-static FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cstring_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__byte **data, FLAC__uint32 *length, FLAC__uint32 length_len)
-{
-	FLAC__byte buffer[sizeof(FLAC__uint32)];
-
-	FLAC__ASSERT(0 != data);
-	FLAC__ASSERT(length_len%8 == 0);
-
-	length_len /= 8; /* convert to bytes */
-
-	FLAC__ASSERT(sizeof(buffer) >= length_len);
-
-	if(read_cb(buffer, 1, length_len, handle) != length_len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	*length = unpack_uint32_(buffer, length_len);
-
-	if(0 != *data)
-		free(*data);
-
-	if(0 == (*data = (FLAC__byte*)safe_malloc_add_2op_(*length, /*+*/1)))
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-	if(*length > 0) {
-		if(read_cb(*data, 1, *length, handle) != *length)
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	}
-
-	(*data)[*length] = '\0';
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Picture *block)
-{
-	FLAC__Metadata_SimpleIteratorStatus status;
-	FLAC__byte buffer[4]; /* asserted below that this is big enough */
-	FLAC__uint32 len;
-
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8);
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_TYPE_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_PICTURE_TYPE_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	block->type = (FLAC__StreamMetadata_Picture_Type)unpack_uint32_(buffer, len);
-
-	if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, (FLAC__byte**)(&(block->mime_type)), &len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK)
-		return status;
-
-	if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, &(block->description), &len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK)
-		return status;
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	block->width = unpack_uint32_(buffer, len);
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	block->height = unpack_uint32_(buffer, len);
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	block->depth = unpack_uint32_(buffer, len);
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_PICTURE_COLORS_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_PICTURE_COLORS_LEN / 8;
-	if(read_cb(buffer, 1, len, handle) != len)
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	block->colors = unpack_uint32_(buffer, len);
-
-	/* for convenience we use read_metadata_block_data_picture_cstring_cb_() even though it adds an extra terminating NUL we don't use */
-	if((status = read_metadata_block_data_picture_cstring_cb_(handle, read_cb, &(block->data), &(block->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) != FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK)
-		return status;
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__Metadata_SimpleIteratorStatus read_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__StreamMetadata_Unknown *block, unsigned block_length)
-{
-	if(block_length == 0) {
-		block->data = 0;
-	}
-	else {
-		if(0 == (block->data = (FLAC__byte*)malloc(block_length)))
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-		if(read_cb(block->data, 1, block_length, handle) != block_length)
-			return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-	}
-
-	return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-}
-
-FLAC__bool write_metadata_block_header_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block)
-{
-	FLAC__ASSERT(0 != file);
-	FLAC__ASSERT(0 != status);
-
-	if(!write_metadata_block_header_cb_((FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, block)) {
-		*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR;
-		return false;
-	}
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_data_(FILE *file, FLAC__Metadata_SimpleIteratorStatus *status, const FLAC__StreamMetadata *block)
-{
-	FLAC__ASSERT(0 != file);
-	FLAC__ASSERT(0 != status);
-
-	if (write_metadata_block_data_cb_((FLAC__IOHandle)file, (FLAC__IOCallback_Write)fwrite, block)) {
-		*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK;
-		return true;
-	}
-	else {
-		*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR;
-		return false;
-	}
-}
-
-FLAC__bool write_metadata_block_header_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block)
-{
-	FLAC__byte buffer[FLAC__STREAM_METADATA_HEADER_LENGTH];
-
-	FLAC__ASSERT(block->length < (1u << FLAC__STREAM_METADATA_LENGTH_LEN));
-
-	buffer[0] = (block->is_last? 0x80 : 0) | (FLAC__byte)block->type;
-	pack_uint32_(block->length, buffer + 1, 3);
-
-	if(write_cb(buffer, 1, FLAC__STREAM_METADATA_HEADER_LENGTH, handle) != FLAC__STREAM_METADATA_HEADER_LENGTH)
-		return false;
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_data_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata *block)
-{
-	FLAC__ASSERT(0 != block);
-
-	switch(block->type) {
-		case FLAC__METADATA_TYPE_STREAMINFO:
-			return write_metadata_block_data_streaminfo_cb_(handle, write_cb, &block->data.stream_info);
-		case FLAC__METADATA_TYPE_PADDING:
-			return write_metadata_block_data_padding_cb_(handle, write_cb, &block->data.padding, block->length);
-		case FLAC__METADATA_TYPE_APPLICATION:
-			return write_metadata_block_data_application_cb_(handle, write_cb, &block->data.application, block->length);
-		case FLAC__METADATA_TYPE_SEEKTABLE:
-			return write_metadata_block_data_seektable_cb_(handle, write_cb, &block->data.seek_table);
-		case FLAC__METADATA_TYPE_VORBIS_COMMENT:
-			return write_metadata_block_data_vorbis_comment_cb_(handle, write_cb, &block->data.vorbis_comment);
-		case FLAC__METADATA_TYPE_CUESHEET:
-			return write_metadata_block_data_cuesheet_cb_(handle, write_cb, &block->data.cue_sheet);
-		case FLAC__METADATA_TYPE_PICTURE:
-			return write_metadata_block_data_picture_cb_(handle, write_cb, &block->data.picture);
-		default:
-			return write_metadata_block_data_unknown_cb_(handle, write_cb, &block->data.unknown, block->length);
-	}
-}
-
-FLAC__bool write_metadata_block_data_streaminfo_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_StreamInfo *block)
-{
-	FLAC__byte buffer[FLAC__STREAM_METADATA_STREAMINFO_LENGTH];
-	const unsigned channels1 = block->channels - 1;
-	const unsigned bps1 = block->bits_per_sample - 1;
-
-	/* we are using hardcoded numbers for simplicity but we should
-	 * probably eventually write a bit-level packer and use the
-	 * _STREAMINFO_ constants.
-	 */
-	pack_uint32_(block->min_blocksize, buffer, 2);
-	pack_uint32_(block->max_blocksize, buffer+2, 2);
-	pack_uint32_(block->min_framesize, buffer+4, 3);
-	pack_uint32_(block->max_framesize, buffer+7, 3);
-	buffer[10] = (block->sample_rate >> 12) & 0xff;
-	buffer[11] = (block->sample_rate >> 4) & 0xff;
-	buffer[12] = ((block->sample_rate & 0x0f) << 4) | (channels1 << 1) | (bps1 >> 4);
-	buffer[13] = (FLAC__byte)(((bps1 & 0x0f) << 4) | ((block->total_samples >> 32) & 0x0f));
-	pack_uint32_((FLAC__uint32)block->total_samples, buffer+14, 4);
-	memcpy(buffer+18, block->md5sum, 16);
-
-	if(write_cb(buffer, 1, FLAC__STREAM_METADATA_STREAMINFO_LENGTH, handle) != FLAC__STREAM_METADATA_STREAMINFO_LENGTH)
-		return false;
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_data_padding_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Padding *block, unsigned block_length)
-{
-	unsigned i, n = block_length;
-	FLAC__byte buffer[1024];
-
-	(void)block;
-
-	memset(buffer, 0, 1024);
-
-	for(i = 0; i < n/1024; i++)
-		if(write_cb(buffer, 1, 1024, handle) != 1024)
-			return false;
-
-	n %= 1024;
-
-	if(write_cb(buffer, 1, n, handle) != n)
-		return false;
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_data_application_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Application *block, unsigned block_length)
-{
-	const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8;
-
-	if(write_cb(block->id, 1, id_bytes, handle) != id_bytes)
-		return false;
-
-	block_length -= id_bytes;
-
-	if(write_cb(block->data, 1, block_length, handle) != block_length)
-		return false;
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_data_seektable_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_SeekTable *block)
-{
-	unsigned i;
-	FLAC__byte buffer[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH];
-
-	for(i = 0; i < block->num_points; i++) {
-		/* some MAGIC NUMBERs here */
-		pack_uint64_(block->points[i].sample_number, buffer, 8);
-		pack_uint64_(block->points[i].stream_offset, buffer+8, 8);
-		pack_uint32_(block->points[i].frame_samples, buffer+16, 2);
-		if(write_cb(buffer, 1, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH, handle) != FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)
-			return false;
-	}
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_data_vorbis_comment_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_VorbisComment *block)
-{
-	unsigned i;
-	const unsigned entry_length_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8;
-	const unsigned num_comments_len = FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN / 8;
-	FLAC__byte buffer[4]; /* magic number is asserted below */
-
-	FLAC__ASSERT(max(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN, FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN) / 8 == sizeof(buffer));
-
-	pack_uint32_little_endian_(block->vendor_string.length, buffer, entry_length_len);
-	if(write_cb(buffer, 1, entry_length_len, handle) != entry_length_len)
-		return false;
-	if(write_cb(block->vendor_string.entry, 1, block->vendor_string.length, handle) != block->vendor_string.length)
-		return false;
-
-	pack_uint32_little_endian_(block->num_comments, buffer, num_comments_len);
-	if(write_cb(buffer, 1, num_comments_len, handle) != num_comments_len)
-		return false;
-
-	for(i = 0; i < block->num_comments; i++) {
-		pack_uint32_little_endian_(block->comments[i].length, buffer, entry_length_len);
-		if(write_cb(buffer, 1, entry_length_len, handle) != entry_length_len)
-			return false;
-		if(write_cb(block->comments[i].entry, 1, block->comments[i].length, handle) != block->comments[i].length)
-			return false;
-	}
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_data_cuesheet_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_CueSheet *block)
-{
-	unsigned i, j, len;
-	FLAC__byte buffer[1024]; /* asserted below that this is big enough */
-
-	FLAC__ASSERT(sizeof(buffer) >= sizeof(FLAC__uint64));
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN/8);
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN / 8;
-	if(write_cb(block->media_catalog_number, 1, len, handle) != len)
-		return false;
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN / 8;
-	pack_uint64_(block->lead_in, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-
-	FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) % 8 == 0);
-	len = (FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN + FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN) / 8;
-	memset(buffer, 0, len);
-	if(block->is_cd)
-		buffer[0] |= 0x80;
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-
-	FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN % 8 == 0);
-	len = FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN / 8;
-	pack_uint32_(block->num_tracks, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-
-	for(i = 0; i < block->num_tracks; i++) {
-		FLAC__StreamMetadata_CueSheet_Track *track = block->tracks + i;
-
-		FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN % 8 == 0);
-		len = FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN / 8;
-		pack_uint64_(track->offset, buffer, len);
-		if(write_cb(buffer, 1, len, handle) != len)
-			return false;
-
-		FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN % 8 == 0);
-		len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN / 8;
-		pack_uint32_(track->number, buffer, len);
-		if(write_cb(buffer, 1, len, handle) != len)
-			return false;
-
-		FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0);
-		len = FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN / 8;
-		if(write_cb(track->isrc, 1, len, handle) != len)
-			return false;
-
-		FLAC__ASSERT((FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) % 8 == 0);
-		len = (FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN + FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN) / 8;
-		memset(buffer, 0, len);
-		buffer[0] = (track->type << 7) | (track->pre_emphasis << 6);
-		if(write_cb(buffer, 1, len, handle) != len)
-			return false;
-
-		FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN % 8 == 0);
-		len = FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN / 8;
-		pack_uint32_(track->num_indices, buffer, len);
-		if(write_cb(buffer, 1, len, handle) != len)
-			return false;
-
-		for(j = 0; j < track->num_indices; j++) {
-			FLAC__StreamMetadata_CueSheet_Index *index = track->indices + j;
-
-			FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN % 8 == 0);
-			len = FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN / 8;
-			pack_uint64_(index->offset, buffer, len);
-			if(write_cb(buffer, 1, len, handle) != len)
-				return false;
-
-			FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN % 8 == 0);
-			len = FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN / 8;
-			pack_uint32_(index->number, buffer, len);
-			if(write_cb(buffer, 1, len, handle) != len)
-				return false;
-
-			FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN % 8 == 0);
-			len = FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN / 8;
-			memset(buffer, 0, len);
-			if(write_cb(buffer, 1, len, handle) != len)
-				return false;
-		}
-	}
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_data_picture_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Picture *block)
-{
-	unsigned len;
-	size_t slen;
-	FLAC__byte buffer[4]; /* magic number is asserted below */
-
-	FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_TYPE_LEN%8);
-	FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN%8);
-	FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN%8);
-	FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN%8);
-	FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN%8);
-	FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN%8);
-	FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_COLORS_LEN%8);
-	FLAC__ASSERT(0 == FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN%8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8);
-	FLAC__ASSERT(sizeof(buffer) >= FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN/8);
-
-	len = FLAC__STREAM_METADATA_PICTURE_TYPE_LEN/8;
-	pack_uint32_(block->type, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-
-	len = FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN/8;
-	slen = strlen(block->mime_type);
-	pack_uint32_(slen, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-	if(write_cb(block->mime_type, 1, slen, handle) != slen)
-		return false;
-
-	len = FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN/8;
-	slen = strlen((const char *)block->description);
-	pack_uint32_(slen, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-	if(write_cb(block->description, 1, slen, handle) != slen)
-		return false;
-
-	len = FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN/8;
-	pack_uint32_(block->width, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-
-	len = FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN/8;
-	pack_uint32_(block->height, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-
-	len = FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN/8;
-	pack_uint32_(block->depth, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-
-	len = FLAC__STREAM_METADATA_PICTURE_COLORS_LEN/8;
-	pack_uint32_(block->colors, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-
-	len = FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN/8;
-	pack_uint32_(block->data_length, buffer, len);
-	if(write_cb(buffer, 1, len, handle) != len)
-		return false;
-	if(write_cb(block->data, 1, block->data_length, handle) != block->data_length)
-		return false;
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_data_unknown_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Write write_cb, const FLAC__StreamMetadata_Unknown *block, unsigned block_length)
-{
-	if(write_cb(block->data, 1, block_length, handle) != block_length)
-		return false;
-
-	return true;
-}
-
-FLAC__bool write_metadata_block_stationary_(FLAC__Metadata_SimpleIterator *iterator, const FLAC__StreamMetadata *block)
-{
-	if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	if(!write_metadata_block_header_(iterator->file, &iterator->status, block))
-		return false;
-
-	if(!write_metadata_block_data_(iterator->file, &iterator->status, block))
-		return false;
-
-	if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	return read_metadata_block_header_(iterator);
-}
-
-FLAC__bool write_metadata_block_stationary_with_padding_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, unsigned padding_length, FLAC__bool padding_is_last)
-{
-	FLAC__StreamMetadata *padding;
-
-	if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	block->is_last = false;
-
-	if(!write_metadata_block_header_(iterator->file, &iterator->status, block))
-		return false;
-
-	if(!write_metadata_block_data_(iterator->file, &iterator->status, block))
-		return false;
-
-	if(0 == (padding = FLAC__metadata_object_new(FLAC__METADATA_TYPE_PADDING)))
-		return FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-
-	padding->is_last = padding_is_last;
-	padding->length = padding_length;
-
-	if(!write_metadata_block_header_(iterator->file, &iterator->status, padding)) {
-		FLAC__metadata_object_delete(padding);
-		return false;
-	}
-
-	if(!write_metadata_block_data_(iterator->file, &iterator->status, padding)) {
-		FLAC__metadata_object_delete(padding);
-		return false;
-	}
-
-	FLAC__metadata_object_delete(padding);
-
-	if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	return read_metadata_block_header_(iterator);
-}
-
-FLAC__bool rewrite_whole_file_(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool append)
-{
-	FILE *tempfile;
-	char *tempfilename;
-	int fixup_is_last_code = 0; /* 0 => no need to change any is_last flags */
-	off_t fixup_is_last_flag_offset = -1;
-
-	FLAC__ASSERT(0 != block || append == false);
-
-	if(iterator->is_last) {
-		if(append) {
-			fixup_is_last_code = 1; /* 1 => clear the is_last flag at the following offset */
-			fixup_is_last_flag_offset = iterator->offset[iterator->depth];
-		}
-		else if(0 == block) {
-			simple_iterator_push_(iterator);
-			if(!FLAC__metadata_simple_iterator_prev(iterator)) {
-				(void)simple_iterator_pop_(iterator);
-				return false;
-			}
-			fixup_is_last_code = -1; /* -1 => set the is_last the flag at the following offset */
-			fixup_is_last_flag_offset = iterator->offset[iterator->depth];
-			if(!simple_iterator_pop_(iterator))
-				return false;
-		}
-	}
-
-	if(!simple_iterator_copy_file_prefix_(iterator, &tempfile, &tempfilename, append))
-		return false;
-
-	if(0 != block) {
-		if(!write_metadata_block_header_(tempfile, &iterator->status, block)) {
-			cleanup_tempfile_(&tempfile, &tempfilename);
-			return false;
-		}
-
-		if(!write_metadata_block_data_(tempfile, &iterator->status, block)) {
-			cleanup_tempfile_(&tempfile, &tempfilename);
-			return false;
-		}
-	}
-
-	if(!simple_iterator_copy_file_postfix_(iterator, &tempfile, &tempfilename, fixup_is_last_code, fixup_is_last_flag_offset, block==0))
-		return false;
-
-	if(append)
-		return FLAC__metadata_simple_iterator_next(iterator);
-
-	return true;
-}
-
-void simple_iterator_push_(FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(iterator->depth+1 < SIMPLE_ITERATOR_MAX_PUSH_DEPTH);
-	iterator->offset[iterator->depth+1] = iterator->offset[iterator->depth];
-	iterator->depth++;
-}
-
-FLAC__bool simple_iterator_pop_(FLAC__Metadata_SimpleIterator *iterator)
-{
-	FLAC__ASSERT(iterator->depth > 0);
-	iterator->depth--;
-	if(0 != fseeko(iterator->file, iterator->offset[iterator->depth], SEEK_SET)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-
-	return read_metadata_block_header_(iterator);
-}
-
-/* return meanings:
- * 0: ok
- * 1: read error
- * 2: seek error
- * 3: not a FLAC file
- */
-unsigned seek_to_first_metadata_block_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Seek seek_cb)
-{
-	FLAC__byte buffer[4];
-	size_t n;
-	unsigned i;
-
-	FLAC__ASSERT(FLAC__STREAM_SYNC_LENGTH == sizeof(buffer));
-
-	/* skip any id3v2 tag */
-	errno = 0;
-	n = read_cb(buffer, 1, 4, handle);
-	if(errno)
-		return 1;
-	else if(n != 4)
-		return 3;
-	else if(0 == memcmp(buffer, "ID3", 3)) {
-		unsigned tag_length = 0;
-
-		/* skip to the tag length */
-		if(seek_cb(handle, 2, SEEK_CUR) < 0)
-			return 2;
-
-		/* read the length */
-		for(i = 0; i < 4; i++) {
-			if(read_cb(buffer, 1, 1, handle) < 1 || buffer[0] & 0x80)
-				return 1;
-			tag_length <<= 7;
-			tag_length |= (buffer[0] & 0x7f);
-		}
-
-		/* skip the rest of the tag */
-		if(seek_cb(handle, tag_length, SEEK_CUR) < 0)
-			return 2;
-
-		/* read the stream sync code */
-		errno = 0;
-		n = read_cb(buffer, 1, 4, handle);
-		if(errno)
-			return 1;
-		else if(n != 4)
-			return 3;
-	}
-
-	/* check for the fLaC signature */
-	if(0 == memcmp(FLAC__STREAM_SYNC_STRING, buffer, FLAC__STREAM_SYNC_LENGTH))
-		return 0;
-	else
-		return 3;
-}
-
-unsigned seek_to_first_metadata_block_(FILE *f)
-{
-	return seek_to_first_metadata_block_cb_((FLAC__IOHandle)f, (FLAC__IOCallback_Read)fread, fseek_wrapper_);
-}
-
-FLAC__bool simple_iterator_copy_file_prefix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, FLAC__bool append)
-{
-	const off_t offset_end = append? iterator->offset[iterator->depth] + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length : iterator->offset[iterator->depth];
-
-	if(0 != fseeko(iterator->file, 0, SEEK_SET)) {
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-	if(!open_tempfile_(iterator->filename, iterator->tempfile_path_prefix, tempfile, tempfilename, &iterator->status)) {
-		cleanup_tempfile_(tempfile, tempfilename);
-		return false;
-	}
-	if(!copy_n_bytes_from_file_(iterator->file, *tempfile, offset_end, &iterator->status)) {
-		cleanup_tempfile_(tempfile, tempfilename);
-		return false;
-	}
-
-	return true;
-}
-
-FLAC__bool simple_iterator_copy_file_postfix_(FLAC__Metadata_SimpleIterator *iterator, FILE **tempfile, char **tempfilename, int fixup_is_last_code, off_t fixup_is_last_flag_offset, FLAC__bool backup)
-{
-	off_t save_offset = iterator->offset[iterator->depth];
-	FLAC__ASSERT(0 != *tempfile);
-
-	if(0 != fseeko(iterator->file, save_offset + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length, SEEK_SET)) {
-		cleanup_tempfile_(tempfile, tempfilename);
-		iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-		return false;
-	}
-	if(!copy_remaining_bytes_from_file_(iterator->file, *tempfile, &iterator->status)) {
-		cleanup_tempfile_(tempfile, tempfilename);
-		return false;
-	}
-
-	if(fixup_is_last_code != 0) {
-		/*
-		 * if code == 1, it means a block was appended to the end so
-		 *   we have to clear the is_last flag of the previous block
-		 * if code == -1, it means the last block was deleted so
-		 *   we have to set the is_last flag of the previous block
-		 */
-		/* MAGIC NUMBERs here; we know the is_last flag is the high bit of the byte at this location */
-		FLAC__byte x;
-		if(0 != fseeko(*tempfile, fixup_is_last_flag_offset, SEEK_SET)) {
-			cleanup_tempfile_(tempfile, tempfilename);
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-			return false;
-		}
-		if(fread(&x, 1, 1, *tempfile) != 1) {
-			cleanup_tempfile_(tempfile, tempfilename);
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-			return false;
-		}
-		if(fixup_is_last_code > 0) {
-			FLAC__ASSERT(x & 0x80);
-			x &= 0x7f;
-		}
-		else {
-			FLAC__ASSERT(!(x & 0x80));
-			x |= 0x80;
-		}
-		if(0 != fseeko(*tempfile, fixup_is_last_flag_offset, SEEK_SET)) {
-			cleanup_tempfile_(tempfile, tempfilename);
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR;
-			return false;
-		}
-		if(local__fwrite(&x, 1, 1, *tempfile) != 1) {
-			cleanup_tempfile_(tempfile, tempfilename);
-			iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR;
-			return false;
-		}
-	}
-
-	(void)fclose(iterator->file);
-
-	if(!transport_tempfile_(iterator->filename, tempfile, tempfilename, &iterator->status))
-		return false;
-
-	if(iterator->has_stats)
-		set_file_stats_(iterator->filename, &iterator->stats);
-
-	if(!simple_iterator_prime_input_(iterator, !iterator->is_writable))
-		return false;
-	if(backup) {
-		while(iterator->offset[iterator->depth] + (off_t)FLAC__STREAM_METADATA_HEADER_LENGTH + (off_t)iterator->length < save_offset)
-			if(!FLAC__metadata_simple_iterator_next(iterator))
-				return false;
-		return true;
-	}
-	else {
-		/* move the iterator to it's original block faster by faking a push, then doing a pop_ */
-		FLAC__ASSERT(iterator->depth == 0);
-		iterator->offset[0] = save_offset;
-		iterator->depth++;
-		return simple_iterator_pop_(iterator);
-	}
-}
-
-FLAC__bool copy_n_bytes_from_file_(FILE *file, FILE *tempfile, off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status)
-{
-	FLAC__byte buffer[8192];
-	size_t n;
-
-	FLAC__ASSERT(bytes >= 0);
-	while(bytes > 0) {
-		n = min(sizeof(buffer), (size_t)bytes);
-		if(fread(buffer, 1, n, file) != n) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-			return false;
-		}
-		if(local__fwrite(buffer, 1, n, tempfile) != n) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR;
-			return false;
-		}
-		bytes -= n;
-	}
-
-	return true;
-}
-
-FLAC__bool copy_n_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, off_t bytes, FLAC__Metadata_SimpleIteratorStatus *status)
-{
-	FLAC__byte buffer[8192];
-	size_t n;
-
-	FLAC__ASSERT(bytes >= 0);
-	while(bytes > 0) {
-		n = min(sizeof(buffer), (size_t)bytes);
-		if(read_cb(buffer, 1, n, handle) != n) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-			return false;
-		}
-		if(temp_write_cb(buffer, 1, n, temp_handle) != n) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR;
-			return false;
-		}
-		bytes -= n;
-	}
-
-	return true;
-}
-
-FLAC__bool copy_remaining_bytes_from_file_(FILE *file, FILE *tempfile, FLAC__Metadata_SimpleIteratorStatus *status)
-{
-	FLAC__byte buffer[8192];
-	size_t n;
-
-	while(!feof(file)) {
-		n = fread(buffer, 1, sizeof(buffer), file);
-		if(n == 0 && !feof(file)) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-			return false;
-		}
-		if(n > 0 && local__fwrite(buffer, 1, n, tempfile) != n) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR;
-			return false;
-		}
-	}
-
-	return true;
-}
-
-FLAC__bool copy_remaining_bytes_from_file_cb_(FLAC__IOHandle handle, FLAC__IOCallback_Read read_cb, FLAC__IOCallback_Eof eof_cb, FLAC__IOHandle temp_handle, FLAC__IOCallback_Write temp_write_cb, FLAC__Metadata_SimpleIteratorStatus *status)
-{
-	FLAC__byte buffer[8192];
-	size_t n;
-
-	while(!eof_cb(handle)) {
-		n = read_cb(buffer, 1, sizeof(buffer), handle);
-		if(n == 0 && !eof_cb(handle)) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR;
-			return false;
-		}
-		if(n > 0 && temp_write_cb(buffer, 1, n, temp_handle) != n) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR;
-			return false;
-		}
-	}
-
-	return true;
-}
-
-FLAC__bool open_tempfile_(const char *filename, const char *tempfile_path_prefix, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status)
-{
-	static const char *tempfile_suffix = ".metadata_edit";
-	if(0 == tempfile_path_prefix) {
-		if(0 == (*tempfilename = (char*)safe_malloc_add_3op_(strlen(filename), /*+*/strlen(tempfile_suffix), /*+*/1))) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-			return false;
-		}
-		strcpy(*tempfilename, filename);
-		strcat(*tempfilename, tempfile_suffix);
-	}
-	else {
-		const char *p = strrchr(filename, '/');
-		if(0 == p)
-			p = filename;
-		else
-			p++;
-
-		if(0 == (*tempfilename = (char*)safe_malloc_add_4op_(strlen(tempfile_path_prefix), /*+*/strlen(p), /*+*/strlen(tempfile_suffix), /*+*/2))) {
-			*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR;
-			return false;
-		}
-		strcpy(*tempfilename, tempfile_path_prefix);
-		strcat(*tempfilename, "/");
-		strcat(*tempfilename, p);
-		strcat(*tempfilename, tempfile_suffix);
-	}
-
-	if(0 == (*tempfile = fopen(*tempfilename, "w+b"))) {
-		*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE;
-		return false;
-	}
-
-	return true;
-}
-
-FLAC__bool transport_tempfile_(const char *filename, FILE **tempfile, char **tempfilename, FLAC__Metadata_SimpleIteratorStatus *status)
-{
-	FLAC__ASSERT(0 != filename);
-	FLAC__ASSERT(0 != tempfile);
-	FLAC__ASSERT(0 != *tempfile);
-	FLAC__ASSERT(0 != tempfilename);
-	FLAC__ASSERT(0 != *tempfilename);
-	FLAC__ASSERT(0 != status);
-
-	(void)fclose(*tempfile);
-	*tempfile = 0;
-
-#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ || defined __EMX__
-	/* on some flavors of windows, rename() will fail if the destination already exists */
-	if(unlink(filename) < 0) {
-		cleanup_tempfile_(tempfile, tempfilename);
-		*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR;
-		return false;
-	}
-#endif
-
-	/*@@@ to fully support the tempfile_path_prefix we need to update this piece to actually copy across filesystems instead of just rename(): */
-	if(0 != rename(*tempfilename, filename)) {
-		cleanup_tempfile_(tempfile, tempfilename);
-		*status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR;
-		return false;
-	}
-
-	cleanup_tempfile_(tempfile, tempfilename);
-
-	return true;
-}
-
-void cleanup_tempfile_(FILE **tempfile, char **tempfilename)
-{
-	if(0 != *tempfile) {
-		(void)fclose(*tempfile);
-		*tempfile = 0;
-	}
-
-	if(0 != *tempfilename) {
-		(void)unlink(*tempfilename);
-		free(*tempfilename);
-		*tempfilename = 0;
-	}
-}
-
-FLAC__bool get_file_stats_(const char *filename, struct stat *stats)
-{
-	FLAC__ASSERT(0 != filename);
-	FLAC__ASSERT(0 != stats);
-	return (0 == stat(filename, stats));
-}
-
-void set_file_stats_(const char *filename, struct stat *stats)
-{
-	struct utimbuf srctime;
-
-	FLAC__ASSERT(0 != filename);
-	FLAC__ASSERT(0 != stats);
-
-	srctime.actime = stats->st_atime;
-	srctime.modtime = stats->st_mtime;
-	(void)chmod(filename, stats->st_mode);
-	(void)utime(filename, &srctime);
-#if !defined _MSC_VER && !defined __BORLANDC__ && !defined __MINGW32__ && !defined __EMX__
-	(void)chown(filename, stats->st_uid, -1);
-	(void)chown(filename, -1, stats->st_gid);
-#endif
-}
-
-int fseek_wrapper_(FLAC__IOHandle handle, FLAC__int64 offset, int whence)
-{
-	return fseeko((FILE*)handle, (off_t)offset, whence);
-}
-
-FLAC__int64 ftell_wrapper_(FLAC__IOHandle handle)
-{
-	return ftello((FILE*)handle);
-}
-
-FLAC__Metadata_ChainStatus get_equivalent_status_(FLAC__Metadata_SimpleIteratorStatus status)
-{
-	switch(status) {
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK:
-			return FLAC__METADATA_CHAIN_STATUS_OK;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT:
-			return FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE:
-			return FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE:
-			return FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE:
-			return FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA:
-			return FLAC__METADATA_CHAIN_STATUS_BAD_METADATA;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR:
-			return FLAC__METADATA_CHAIN_STATUS_READ_ERROR;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR:
-			return FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR:
-			return FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR:
-			return FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR:
-			return FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR:
-			return FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR;
-		case FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR:
-		default:
-			return FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR;
-	}
-}
diff --git a/libFLAC/metadata_object.c b/libFLAC/metadata_object.c
deleted file mode 100644
index a1465f5..0000000
--- a/libFLAC/metadata_object.c
+++ /dev/null
@@ -1,1819 +0,0 @@
-/* libFLAC - Free Lossless Audio Codec library
- * Copyright (C) 2001,2002,2003,2004,2005,2006,2007  Josh Coalson
- *
- * Redistribution and use 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 the Xiph.org Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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 FOUNDATION 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.
- */
-
-#if HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "private/metadata.h"
-
-#include "FLAC/assert.h"
-#include "share/alloc.h"
-
-
-/****************************************************************************
- *
- * Local routines
- *
- ***************************************************************************/
-
-/* copy bytes:
- *  from = NULL  && bytes = 0
- *       to <- NULL
- *  from != NULL && bytes > 0
- *       to <- copy of from
- *  else ASSERT
- * malloc error leaves 'to' unchanged
- */
-static FLAC__bool copy_bytes_(FLAC__byte **to, const FLAC__byte *from, unsigned bytes)
-{
-	FLAC__ASSERT(0 != to);
-	if(bytes > 0 && 0 != from) {
-		FLAC__byte *x;
-		if(0 == (x = (FLAC__byte*)safe_malloc_(bytes)))
-			return false;
-		memcpy(x, from, bytes);
-		*to = x;
-	}
-	else {
-		FLAC__ASSERT(0 == from);
-		FLAC__ASSERT(bytes == 0);
-		*to = 0;
-	}
-	return true;
-}
-
-#if 0 /* UNUSED */
-/* like copy_bytes_(), but free()s the original '*to' if the copy succeeds and the original '*to' is non-NULL */
-static FLAC__bool free_copy_bytes_(FLAC__byte **to, const FLAC__byte *from, unsigned bytes)
-{
-	FLAC__byte *copy;
-	FLAC__ASSERT(0 != to);
-	if(copy_bytes_(&copy, from, bytes)) {
-		if(*to)
-			free(*to);
-		*to = copy;
-		return true;
-	}
-	else
-		return false;
-}
-#endif
-
-/* reallocate entry to 1 byte larger and add a terminating NUL */
-/* realloc() failure leaves entry unchanged */
-static FLAC__bool ensure_null_terminated_(FLAC__byte **entry, unsigned length)
-{
-	FLAC__byte *x = (FLAC__byte*)safe_realloc_add_2op_(*entry, length, /*+*/1);
-	if(0 != x) {
-		x[length] = '\0';
-		*entry = x;
-		return true;
-	}
-	else
-		return false;
-}
-
-/* copies the NUL-terminated C-string 'from' to '*to', leaving '*to'
- * unchanged if malloc fails, free()ing the original '*to' if it
- * succeeds and the original '*to' was not NULL
- */
-static FLAC__bool copy_cstring_(char **to, const char *from)
-{
-	char *copy = strdup(from);
-	FLAC__ASSERT(to);
-	if(copy) {
-		if(*to)
-			free(*to);
-		*to = copy;
-		return true;
-	}
-	else
-		return false;
-}
-
-static FLAC__bool copy_vcentry_(FLAC__StreamMetadata_VorbisComment_Entry *to, const FLAC__StreamMetadata_VorbisComment_Entry *from)
-{
-	to->length = from->length;
-	if(0 == from->entry) {
-		FLAC__ASSERT(from->length == 0);
-		to->entry = 0;
-	}
-	else {
-		FLAC__byte *x;
-		FLAC__ASSERT(from->length > 0);
-		if(0 == (x = (FLAC__byte*)safe_malloc_add_2op_(from->length, /*+*/1)))
-			return false;
-		memcpy(x, from->entry, from->length);
-		x[from->length] = '\0';
-		to->entry = x;
-	}
-	return true;
-}
-
-static FLAC__bool copy_track_(FLAC__StreamMetadata_CueSheet_Track *to, const FLAC__StreamMetadata_CueSheet_Track *from)
-{
-	memcpy(to, from, sizeof(FLAC__StreamMetadata_CueSheet_Track));
-	if(0 == from->indices) {
-		FLAC__ASSERT(from->num_indices == 0);
-	}
-	else {
-		FLAC__StreamMetadata_CueSheet_Index *x;
-		FLAC__ASSERT(from->num_indices > 0);
-		if(0 == (x = (FLAC__StreamMetadata_CueSheet_Index*)safe_malloc_mul_2op_(from->num_indices, /*times*/sizeof(FLAC__StreamMetadata_CueSheet_Index))))
-			return false;
-		memcpy(x, from->indices, from->num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index));
-		to->indices = x;
-	}
-	return true;
-}
-
-static void seektable_calculate_length_(FLAC__StreamMetadata *object)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-
-	object->length = object->data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH;
-}
-
-static FLAC__StreamMetadata_SeekPoint *seekpoint_array_new_(unsigned num_points)
-{
-	FLAC__StreamMetadata_SeekPoint *object_array;
-
-	FLAC__ASSERT(num_points > 0);
-
-	object_array = (FLAC__StreamMetadata_SeekPoint*)safe_malloc_mul_2op_(num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint));
-
-	if(0 != object_array) {
-		unsigned i;
-		for(i = 0; i < num_points; i++) {
-			object_array[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
-			object_array[i].stream_offset = 0;
-			object_array[i].frame_samples = 0;
-		}
-	}
-
-	return object_array;
-}
-
-static void vorbiscomment_calculate_length_(FLAC__StreamMetadata *object)
-{
-	unsigned i;
-
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
-
-	object->length = (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN) / 8;
-	object->length += object->data.vorbis_comment.vendor_string.length;
-	object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN) / 8;
-	for(i = 0; i < object->data.vorbis_comment.num_comments; i++) {
-		object->length += (FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN / 8);
-		object->length += object->data.vorbis_comment.comments[i].length;
-	}
-}
-
-static FLAC__StreamMetadata_VorbisComment_Entry *vorbiscomment_entry_array_new_(unsigned num_comments)
-{
-	FLAC__ASSERT(num_comments > 0);
-
-	return (FLAC__StreamMetadata_VorbisComment_Entry*)safe_calloc_(num_comments, sizeof(FLAC__StreamMetadata_VorbisComment_Entry));
-}
-
-static void vorbiscomment_entry_array_delete_(FLAC__StreamMetadata_VorbisComment_Entry *object_array, unsigned num_comments)
-{
-	unsigned i;
-
-	FLAC__ASSERT(0 != object_array && num_comments > 0);
-
-	for(i = 0; i < num_comments; i++)
-		if(0 != object_array[i].entry)
-			free(object_array[i].entry);
-
-	if(0 != object_array)
-		free(object_array);
-}
-
-static FLAC__StreamMetadata_VorbisComment_Entry *vorbiscomment_entry_array_copy_(const FLAC__StreamMetadata_VorbisComment_Entry *object_array, unsigned num_comments)
-{
-	FLAC__StreamMetadata_VorbisComment_Entry *return_array;
-
-	FLAC__ASSERT(0 != object_array);
-	FLAC__ASSERT(num_comments > 0);
-
-	return_array = vorbiscomment_entry_array_new_(num_comments);
-
-	if(0 != return_array) {
-		unsigned i;
-
-		for(i = 0; i < num_comments; i++) {
-			if(!copy_vcentry_(return_array+i, object_array+i)) {
-				vorbiscomment_entry_array_delete_(return_array, num_comments);
-				return 0;
-			}
-		}
-	}
-
-	return return_array;
-}
-
-static FLAC__bool vorbiscomment_set_entry_(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry *dest, const FLAC__StreamMetadata_VorbisComment_Entry *src, FLAC__bool copy)
-{
-	FLAC__byte *save;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(0 != dest);
-	FLAC__ASSERT(0 != src);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
-	FLAC__ASSERT((0 != src->entry && src->length > 0) || (0 == src->entry && src->length == 0));
-
-	save = dest->entry;
-
-	if(0 != src->entry && src->length > 0) {
-		if(copy) {
-			/* do the copy first so that if we fail we leave the dest object untouched */
-			if(!copy_vcentry_(dest, src))
-				return false;
-		}
-		else {
-			/* we have to make sure that the string we're taking over is null-terminated */
-
-			/*
-			 * Stripping the const from src->entry is OK since we're taking
-			 * ownership of the pointer.  This is a hack around a deficiency
-			 * in the API where the same function is used for 'copy' and
-			 * 'own', but the source entry is a const pointer.  If we were
-			 * precise, the 'own' flavor would be a separate function with a
-			 * non-const source pointer.  But it's not, so we hack away.
-			 */
-			if(!ensure_null_terminated_((FLAC__byte**)(&src->entry), src->length))
-				return false;
-			*dest = *src;
-		}
-	}
-	else {
-		/* the src is null */
-		*dest = *src;
-	}
-
-	if(0 != save)
-		free(save);
-
-	vorbiscomment_calculate_length_(object);
-	return true;
-}
-
-static int vorbiscomment_find_entry_from_(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name, unsigned field_name_length)
-{
-	unsigned i;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
-	FLAC__ASSERT(0 != field_name);
-
-	for(i = offset; i < object->data.vorbis_comment.num_comments; i++) {
-		if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length))
-			return (int)i;
-	}
-
-	return -1;
-}
-
-static void cuesheet_calculate_length_(FLAC__StreamMetadata *object)
-{
-	unsigned i;
-
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-
-	object->length = (
-		FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN
-	) / 8;
-
-	object->length += object->data.cue_sheet.num_tracks * (
-		FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN +
-		FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN
-	) / 8;
-
-	for(i = 0; i < object->data.cue_sheet.num_tracks; i++) {
-		object->length += object->data.cue_sheet.tracks[i].num_indices * (
-			FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN +
-			FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN +
-			FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN
-		) / 8;
-	}
-}
-
-static FLAC__StreamMetadata_CueSheet_Index *cuesheet_track_index_array_new_(unsigned num_indices)
-{
-	FLAC__ASSERT(num_indices > 0);
-
-	return (FLAC__StreamMetadata_CueSheet_Index*)safe_calloc_(num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index));
-}
-
-static FLAC__StreamMetadata_CueSheet_Track *cuesheet_track_array_new_(unsigned num_tracks)
-{
-	FLAC__ASSERT(num_tracks > 0);
-
-	return (FLAC__StreamMetadata_CueSheet_Track*)safe_calloc_(num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track));
-}
-
-static void cuesheet_track_array_delete_(FLAC__StreamMetadata_CueSheet_Track *object_array, unsigned num_tracks)
-{
-	unsigned i;
-
-	FLAC__ASSERT(0 != object_array && num_tracks > 0);
-
-	for(i = 0; i < num_tracks; i++) {
-		if(0 != object_array[i].indices) {
-			FLAC__ASSERT(object_array[i].num_indices > 0);
-			free(object_array[i].indices);
-		}
-	}
-
-	if(0 != object_array)
-		free(object_array);
-}
-
-static FLAC__StreamMetadata_CueSheet_Track *cuesheet_track_array_copy_(const FLAC__StreamMetadata_CueSheet_Track *object_array, unsigned num_tracks)
-{
-	FLAC__StreamMetadata_CueSheet_Track *return_array;
-
-	FLAC__ASSERT(0 != object_array);
-	FLAC__ASSERT(num_tracks > 0);
-
-	return_array = cuesheet_track_array_new_(num_tracks);
-
-	if(0 != return_array) {
-		unsigned i;
-
-		for(i = 0; i < num_tracks; i++) {
-			if(!copy_track_(return_array+i, object_array+i)) {
-				cuesheet_track_array_delete_(return_array, num_tracks);
-				return 0;
-			}
-		}
-	}
-
-	return return_array;
-}
-
-static FLAC__bool cuesheet_set_track_(FLAC__StreamMetadata *object, FLAC__StreamMetadata_CueSheet_Track *dest, const FLAC__StreamMetadata_CueSheet_Track *src, FLAC__bool copy)
-{
-	FLAC__StreamMetadata_CueSheet_Index *save;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(0 != dest);
-	FLAC__ASSERT(0 != src);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-	FLAC__ASSERT((0 != src->indices && src->num_indices > 0) || (0 == src->indices && src->num_indices == 0));
-
-	save = dest->indices;
-
-	/* do the copy first so that if we fail we leave the object untouched */
-	if(copy) {
-		if(!copy_track_(dest, src))
-			return false;
-	}
-	else {
-		*dest = *src;
-	}
-
-	if(0 != save)
-		free(save);
-
-	cuesheet_calculate_length_(object);
-	return true;
-}
-
-
-/****************************************************************************
- *
- * Metadata object routines
- *
- ***************************************************************************/
-
-FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type)
-{
-	FLAC__StreamMetadata *object;
-
-	if(type > FLAC__MAX_METADATA_TYPE_CODE)
-		return 0;
-
-	object = (FLAC__StreamMetadata*)calloc(1, sizeof(FLAC__StreamMetadata));
-	if(0 != object) {
-		object->is_last = false;
-		object->type = type;
-		switch(type) {
-			case FLAC__METADATA_TYPE_STREAMINFO:
-				object->length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH;
-				break;
-			case FLAC__METADATA_TYPE_PADDING:
-				/* calloc() took care of this for us:
-				object->length = 0;
-				*/
-				break;
-			case FLAC__METADATA_TYPE_APPLICATION:
-				object->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8;
-				/* calloc() took care of this for us:
-				object->data.application.data = 0;
-				*/
-				break;
-			case FLAC__METADATA_TYPE_SEEKTABLE:
-				/* calloc() took care of this for us:
-				object->length = 0;
-				object->data.seek_table.num_points = 0;
-				object->data.seek_table.points = 0;
-				*/
-				break;
-			case FLAC__METADATA_TYPE_VORBIS_COMMENT:
-				object->data.vorbis_comment.vendor_string.length = (unsigned)strlen(FLAC__VENDOR_STRING);
-				if(!copy_bytes_(&object->data.vorbis_comment.vendor_string.entry, (const FLAC__byte*)FLAC__VENDOR_STRING, object->data.vorbis_comment.vendor_string.length+1)) {
-					free(object);
-					return 0;
-				}
-				vorbiscomment_calculate_length_(object);
-				break;
-			case FLAC__METADATA_TYPE_CUESHEET:
-				cuesheet_calculate_length_(object);
-				break;
-			case FLAC__METADATA_TYPE_PICTURE:
-				object->length = (
-					FLAC__STREAM_METADATA_PICTURE_TYPE_LEN +
-					FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN + /* empty mime_type string */
-					FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN + /* empty description string */
-					FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN +
-					FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN +
-					FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN +
-					FLAC__STREAM_METADATA_PICTURE_COLORS_LEN +
-					FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN +
-					0 /* no data */
-				) / 8;
-				object->data.picture.type = FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER;
-				object->data.picture.mime_type = 0;
-				object->data.picture.description = 0;
-				/* calloc() took care of this for us:
-				object->data.picture.width = 0;
-				object->data.picture.height = 0;
-				object->data.picture.depth = 0;
-				object->data.picture.colors = 0;
-				object->data.picture.data_length = 0;
-				object->data.picture.data = 0;
-				*/
-				/* now initialize mime_type and description with empty strings to make things easier on the client */
-				if(!copy_cstring_(&object->data.picture.mime_type, "")) {
-					free(object);
-					return 0;
-				}
-				if(!copy_cstring_((char**)(&object->data.picture.description), "")) {
-					if(object->data.picture.mime_type)
-						free(object->data.picture.mime_type);
-					free(object);
-					return 0;
-				}
-				break;
-			default:
-				/* calloc() took care of this for us:
-				object->length = 0;
-				object->data.unknown.data = 0;
-				*/
-				break;
-		}
-	}
-
-	return object;
-}
-
-FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object)
-{
-	FLAC__StreamMetadata *to;
-
-	FLAC__ASSERT(0 != object);
-
-	if(0 != (to = FLAC__metadata_object_new(object->type))) {
-		to->is_last = object->is_last;
-		to->type = object->type;
-		to->length = object->length;
-		switch(to->type) {
-			case FLAC__METADATA_TYPE_STREAMINFO:
-				memcpy(&to->data.stream_info, &object->data.stream_info, sizeof(FLAC__StreamMetadata_StreamInfo));
-				break;
-			case FLAC__METADATA_TYPE_PADDING:
-				break;
-			case FLAC__METADATA_TYPE_APPLICATION:
-				if(to->length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8) { /* underflow check */
-					FLAC__metadata_object_delete(to);
-					return 0;
-				}
-				memcpy(&to->data.application.id, &object->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8);
-				if(!copy_bytes_(&to->data.application.data, object->data.application.data, object->length - FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) {
-					FLAC__metadata_object_delete(to);
-					return 0;
-				}
-				break;
-			case FLAC__METADATA_TYPE_SEEKTABLE:
-				to->data.seek_table.num_points = object->data.seek_table.num_points;
-				if(to->data.seek_table.num_points > SIZE_MAX / sizeof(FLAC__StreamMetadata_SeekPoint)) { /* overflow check */
-					FLAC__metadata_object_delete(to);
-					return 0;
-				}
-				if(!copy_bytes_((FLAC__byte**)&to->data.seek_table.points, (FLAC__byte*)object->data.seek_table.points, object->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint))) {
-					FLAC__metadata_object_delete(to);
-					return 0;
-				}
-				break;
-			case FLAC__METADATA_TYPE_VORBIS_COMMENT:
-				if(0 != to->data.vorbis_comment.vendor_string.entry) {
-					free(to->data.vorbis_comment.vendor_string.entry);
-					to->data.vorbis_comment.vendor_string.entry = 0;
-				}
-				if(!copy_vcentry_(&to->data.vorbis_comment.vendor_string, &object->data.vorbis_comment.vendor_string)) {
-					FLAC__metadata_object_delete(to);
-					return 0;
-				}
-				if(object->data.vorbis_comment.num_comments == 0) {
-					FLAC__ASSERT(0 == object->data.vorbis_comment.comments);
-					to->data.vorbis_comment.comments = 0;
-				}
-				else {
-					FLAC__ASSERT(0 != object->data.vorbis_comment.comments);
-					to->data.vorbis_comment.comments = vorbiscomment_entry_array_copy_(object->data.vorbis_comment.comments, object->data.vorbis_comment.num_comments);
-					if(0 == to->data.vorbis_comment.comments) {
-						FLAC__metadata_object_delete(to);
-						return 0;
-					}
-				}
-				to->data.vorbis_comment.num_comments = object->data.vorbis_comment.num_comments;
-				break;
-			case FLAC__METADATA_TYPE_CUESHEET:
-				memcpy(&to->data.cue_sheet, &object->data.cue_sheet, sizeof(FLAC__StreamMetadata_CueSheet));
-				if(object->data.cue_sheet.num_tracks == 0) {
-					FLAC__ASSERT(0 == object->data.cue_sheet.tracks);
-				}
-				else {
-					FLAC__ASSERT(0 != object->data.cue_sheet.tracks);
-					to->data.cue_sheet.tracks = cuesheet_track_array_copy_(object->data.cue_sheet.tracks, object->data.cue_sheet.num_tracks);
-					if(0 == to->data.cue_sheet.tracks) {
-						FLAC__metadata_object_delete(to);
-						return 0;
-					}
-				}
-				break;
-			case FLAC__METADATA_TYPE_PICTURE:
-				to->data.picture.type = object->data.picture.type;
-				if(!copy_cstring_(&to->data.picture.mime_type, object->data.picture.mime_type)) {
-					FLAC__metadata_object_delete(to);
-					return 0;
-				}
-				if(!copy_cstring_((char**)(&to->data.picture.description), (const char*)object->data.picture.description)) {
-					FLAC__metadata_object_delete(to);
-					return 0;
-				}
-				to->data.picture.width = object->data.picture.width;
-				to->data.picture.height = object->data.picture.height;
-				to->data.picture.depth = object->data.picture.depth;
-				to->data.picture.colors = object->data.picture.colors;
-				to->data.picture.data_length = object->data.picture.data_length;
-				if(!copy_bytes_((&to->data.picture.data), object->data.picture.data, object->data.picture.data_length)) {
-					FLAC__metadata_object_delete(to);
-					return 0;
-				}
-				break;
-			default:
-				if(!copy_bytes_(&to->data.unknown.data, object->data.unknown.data, object->length)) {
-					FLAC__metadata_object_delete(to);
-					return 0;
-				}
-				break;
-		}
-	}
-
-	return to;
-}
-
-void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object)
-{
-	FLAC__ASSERT(0 != object);
-
-	switch(object->type) {
-		case FLAC__METADATA_TYPE_STREAMINFO:
-		case FLAC__METADATA_TYPE_PADDING:
-			break;
-		case FLAC__METADATA_TYPE_APPLICATION:
-			if(0 != object->data.application.data) {
-				free(object->data.application.data);
-				object->data.application.data = 0;
-			}
-			break;
-		case FLAC__METADATA_TYPE_SEEKTABLE:
-			if(0 != object->data.seek_table.points) {
-				free(object->data.seek_table.points);
-				object->data.seek_table.points = 0;
-			}
-			break;
-		case FLAC__METADATA_TYPE_VORBIS_COMMENT:
-			if(0 != object->data.vorbis_comment.vendor_string.entry) {
-				free(object->data.vorbis_comment.vendor_string.entry);
-				object->data.vorbis_comment.vendor_string.entry = 0;
-			}
-			if(0 != object->data.vorbis_comment.comments) {
-				FLAC__ASSERT(object->data.vorbis_comment.num_comments > 0);
-				vorbiscomment_entry_array_delete_(object->data.vorbis_comment.comments, object->data.vorbis_comment.num_comments);
-			}
-			break;
-		case FLAC__METADATA_TYPE_CUESHEET:
-			if(0 != object->data.cue_sheet.tracks) {
-				FLAC__ASSERT(object->data.cue_sheet.num_tracks > 0);
-				cuesheet_track_array_delete_(object->data.cue_sheet.tracks, object->data.cue_sheet.num_tracks);
-			}
-			break;
-		case FLAC__METADATA_TYPE_PICTURE:
-			if(0 != object->data.picture.mime_type) {
-				free(object->data.picture.mime_type);
-				object->data.picture.mime_type = 0;
-			}
-			if(0 != object->data.picture.description) {
-				free(object->data.picture.description);
-				object->data.picture.description = 0;
-			}
-			if(0 != object->data.picture.data) {
-				free(object->data.picture.data);
-				object->data.picture.data = 0;
-			}
-			break;
-		default:
-			if(0 != object->data.unknown.data) {
-				free(object->data.unknown.data);
-				object->data.unknown.data = 0;
-			}
-			break;
-	}
-}
-
-FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object)
-{
-	FLAC__metadata_object_delete_data(object);
-	free(object);
-}
-
-static FLAC__bool compare_block_data_streaminfo_(const FLAC__StreamMetadata_StreamInfo *block1, const FLAC__StreamMetadata_StreamInfo *block2)
-{
-	if(block1->min_blocksize != block2->min_blocksize)
-		return false;
-	if(block1->max_blocksize != block2->max_blocksize)
-		return false;
-	if(block1->min_framesize != block2->min_framesize)
-		return false;
-	if(block1->max_framesize != block2->max_framesize)
-		return false;
-	if(block1->sample_rate != block2->sample_rate)
-		return false;
-	if(block1->channels != block2->channels)
-		return false;
-	if(block1->bits_per_sample != block2->bits_per_sample)
-		return false;
-	if(block1->total_samples != block2->total_samples)
-		return false;
-	if(0 != memcmp(block1->md5sum, block2->md5sum, 16))
-		return false;
-	return true;
-}
-
-static FLAC__bool compare_block_data_application_(const FLAC__StreamMetadata_Application *block1, const FLAC__StreamMetadata_Application *block2, unsigned block_length)
-{
-	FLAC__ASSERT(0 != block1);
-	FLAC__ASSERT(0 != block2);
-	FLAC__ASSERT(block_length >= sizeof(block1->id));
-
-	if(0 != memcmp(block1->id, block2->id, sizeof(block1->id)))
-		return false;
-	if(0 != block1->data && 0 != block2->data)
-		return 0 == memcmp(block1->data, block2->data, block_length - sizeof(block1->id));
-	else
-		return block1->data == block2->data;
-}
-
-static FLAC__bool compare_block_data_seektable_(const FLAC__StreamMetadata_SeekTable *block1, const FLAC__StreamMetadata_SeekTable *block2)
-{
-	unsigned i;
-
-	FLAC__ASSERT(0 != block1);
-	FLAC__ASSERT(0 != block2);
-
-	if(block1->num_points != block2->num_points)
-		return false;
-
-	if(0 != block1->points && 0 != block2->points) {
-		for(i = 0; i < block1->num_points; i++) {
-			if(block1->points[i].sample_number != block2->points[i].sample_number)
-				return false;
-			if(block1->points[i].stream_offset != block2->points[i].stream_offset)
-				return false;
-			if(block1->points[i].frame_samples != block2->points[i].frame_samples)
-				return false;
-		}
-		return true;
-	}
-	else
-		return block1->points == block2->points;
-}
-
-static FLAC__bool compare_block_data_vorbiscomment_(const FLAC__StreamMetadata_VorbisComment *block1, const FLAC__StreamMetadata_VorbisComment *block2)
-{
-	unsigned i;
-
-	if(block1->vendor_string.length != block2->vendor_string.length)
-		return false;
-
-	if(0 != block1->vendor_string.entry && 0 != block2->vendor_string.entry) {
-		if(0 != memcmp(block1->vendor_string.entry, block2->vendor_string.entry, block1->vendor_string.length))
-			return false;
-	}
-	else if(block1->vendor_string.entry != block2->vendor_string.entry)
-		return false;
-
-	if(block1->num_comments != block2->num_comments)
-		return false;
-
-	for(i = 0; i < block1->num_comments; i++) {
-		if(0 != block1->comments[i].entry && 0 != block2->comments[i].entry) {
-			if(0 != memcmp(block1->comments[i].entry, block2->comments[i].entry, block1->comments[i].length))
-				return false;
-		}
-		else if(block1->comments[i].entry != block2->comments[i].entry)
-			return false;
-	}
-	return true;
-}
-
-static FLAC__bool compare_block_data_cuesheet_(const FLAC__StreamMetadata_CueSheet *block1, const FLAC__StreamMetadata_CueSheet *block2)
-{
-	unsigned i, j;
-
-	if(0 != strcmp(block1->media_catalog_number, block2->media_catalog_number))
-		return false;
-
-	if(block1->lead_in != block2->lead_in)
-		return false;
-
-	if(block1->is_cd != block2->is_cd)
-		return false;
-
-	if(block1->num_tracks != block2->num_tracks)
-		return false;
-
-	if(0 != block1->tracks && 0 != block2->tracks) {
-		FLAC__ASSERT(block1->num_tracks > 0);
-		for(i = 0; i < block1->num_tracks; i++) {
-			if(block1->tracks[i].offset != block2->tracks[i].offset)
-				return false;
-			if(block1->tracks[i].number != block2->tracks[i].number)
-				return false;
-			if(0 != memcmp(block1->tracks[i].isrc, block2->tracks[i].isrc, sizeof(block1->tracks[i].isrc)))
-				return false;
-			if(block1->tracks[i].type != block2->tracks[i].type)
-				return false;
-			if(block1->tracks[i].pre_emphasis != block2->tracks[i].pre_emphasis)
-				return false;
-			if(block1->tracks[i].num_indices != block2->tracks[i].num_indices)
-				return false;
-			if(0 != block1->tracks[i].indices && 0 != block2->tracks[i].indices) {
-				FLAC__ASSERT(block1->tracks[i].num_indices > 0);
-				for(j = 0; j < block1->tracks[i].num_indices; j++) {
-					if(block1->tracks[i].indices[j].offset != block2->tracks[i].indices[j].offset)
-						return false;
-					if(block1->tracks[i].indices[j].number != block2->tracks[i].indices[j].number)
-						return false;
-				}
-			}
-			else if(block1->tracks[i].indices != block2->tracks[i].indices)
-				return false;
-		}
-	}
-	else if(block1->tracks != block2->tracks)
-		return false;
-	return true;
-}
-
-static FLAC__bool compare_block_data_picture_(const FLAC__StreamMetadata_Picture *block1, const FLAC__StreamMetadata_Picture *block2)
-{
-	if(block1->type != block2->type)
-		return false;
-	if(block1->mime_type != block2->mime_type && (0 == block1->mime_type || 0 == block2->mime_type || strcmp(block1->mime_type, block2->mime_type)))
-		return false;
-	if(block1->description != block2->description && (0 == block1->description || 0 == block2->description || strcmp((const char *)block1->description, (const char *)block2->description)))
-		return false;
-	if(block1->width != block2->width)
-		return false;
-	if(block1->height != block2->height)
-		return false;
-	if(block1->depth != block2->depth)
-		return false;
-	if(block1->colors != block2->colors)
-		return false;
-	if(block1->data_length != block2->data_length)
-		return false;
-	if(block1->data != block2->data && (0 == block1->data || 0 == block2->data || memcmp(block1->data, block2->data, block1->data_length)))
-		return false;
-	return true;
-}
-
-static FLAC__bool compare_block_data_unknown_(const FLAC__StreamMetadata_Unknown *block1, const FLAC__StreamMetadata_Unknown *block2, unsigned block_length)
-{
-	FLAC__ASSERT(0 != block1);
-	FLAC__ASSERT(0 != block2);
-
-	if(0 != block1->data && 0 != block2->data)
-		return 0 == memcmp(block1->data, block2->data, block_length);
-	else
-		return block1->data == block2->data;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2)
-{
-	FLAC__ASSERT(0 != block1);
-	FLAC__ASSERT(0 != block2);
-
-	if(block1->type != block2->type) {
-		return false;
-	}
-	if(block1->is_last != block2->is_last) {
-		return false;
-	}
-	if(block1->length != block2->length) {
-		return false;
-	}
-	switch(block1->type) {
-		case FLAC__METADATA_TYPE_STREAMINFO:
-			return compare_block_data_streaminfo_(&block1->data.stream_info, &block2->data.stream_info);
-		case FLAC__METADATA_TYPE_PADDING:
-			return true; /* we don't compare the padding guts */
-		case FLAC__METADATA_TYPE_APPLICATION:
-			return compare_block_data_application_(&block1->data.application, &block2->data.application, block1->length);
-		case FLAC__METADATA_TYPE_SEEKTABLE:
-			return compare_block_data_seektable_(&block1->data.seek_table, &block2->data.seek_table);
-		case FLAC__METADATA_TYPE_VORBIS_COMMENT:
-			return compare_block_data_vorbiscomment_(&block1->data.vorbis_comment, &block2->data.vorbis_comment);
-		case FLAC__METADATA_TYPE_CUESHEET:
-			return compare_block_data_cuesheet_(&block1->data.cue_sheet, &block2->data.cue_sheet);
-		case FLAC__METADATA_TYPE_PICTURE:
-			return compare_block_data_picture_(&block1->data.picture, &block2->data.picture);
-		default:
-			return compare_block_data_unknown_(&block1->data.unknown, &block2->data.unknown, block1->length);
-	}
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy)
-{
-	FLAC__byte *save;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_APPLICATION);
-	FLAC__ASSERT((0 != data && length > 0) || (0 == data && length == 0 && copy == false));
-
-	save = object->data.application.data;
-
-	/* do the copy first so that if we fail we leave the object untouched */
-	if(copy) {
-		if(!copy_bytes_(&object->data.application.data, data, length))
-			return false;
-	}
-	else {
-		object->data.application.data = data;
-	}
-
-	if(0 != save)
-		free(save);
-
-	object->length = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8 + length;
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-
-	if(0 == object->data.seek_table.points) {
-		FLAC__ASSERT(object->data.seek_table.num_points == 0);
-		if(0 == new_num_points)
-			return true;
-		else if(0 == (object->data.seek_table.points = seekpoint_array_new_(new_num_points)))
-			return false;
-	}
-	else {
-		const size_t old_size = object->data.seek_table.num_points * sizeof(FLAC__StreamMetadata_SeekPoint);
-		const size_t new_size = new_num_points * sizeof(FLAC__StreamMetadata_SeekPoint);
-
-		/* overflow check */
-		if((size_t)new_num_points > SIZE_MAX / sizeof(FLAC__StreamMetadata_SeekPoint))
-			return false;
-
-		FLAC__ASSERT(object->data.seek_table.num_points > 0);
-
-		if(new_size == 0) {
-			free(object->data.seek_table.points);
-			object->data.seek_table.points = 0;
-		}
-		else if(0 == (object->data.seek_table.points = (FLAC__StreamMetadata_SeekPoint*)realloc(object->data.seek_table.points, new_size)))
-			return false;
-
-		/* if growing, set new elements to placeholders */
-		if(new_size > old_size) {
-			unsigned i;
-			for(i = object->data.seek_table.num_points; i < new_num_points; i++) {
-				object->data.seek_table.points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER;
-				object->data.seek_table.points[i].stream_offset = 0;
-				object->data.seek_table.points[i].frame_samples = 0;
-			}
-		}
-	}
-
-	object->data.seek_table.num_points = new_num_points;
-
-	seektable_calculate_length_(object);
-	return true;
-}
-
-FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-	FLAC__ASSERT(point_num < object->data.seek_table.num_points);
-
-	object->data.seek_table.points[point_num] = point;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point)
-{
-	int i;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-	FLAC__ASSERT(point_num <= object->data.seek_table.num_points);
-
-	if(!FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points+1))
-		return false;
-
-	/* move all points >= point_num forward one space */
-	for(i = (int)object->data.seek_table.num_points-1; i > (int)point_num; i--)
-		object->data.seek_table.points[i] = object->data.seek_table.points[i-1];
-
-	FLAC__metadata_object_seektable_set_point(object, point_num, point);
-	seektable_calculate_length_(object);
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num)
-{
-	unsigned i;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-	FLAC__ASSERT(point_num < object->data.seek_table.num_points);
-
-	/* move all points > point_num backward one space */
-	for(i = point_num; i < object->data.seek_table.num_points-1; i++)
-		object->data.seek_table.points[i] = object->data.seek_table.points[i+1];
-
-	return FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points-1);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-
-	return FLAC__format_seektable_is_legal(&object->data.seek_table);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-
-	if(num > 0)
-		/* WATCHOUT: we rely on the fact that growing the array adds PLACEHOLDERS at the end */
-		return FLAC__metadata_object_seektable_resize_points(object, object->data.seek_table.num_points + num);
-	else
-		return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number)
-{
-	FLAC__StreamMetadata_SeekTable *seek_table;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-
-	seek_table = &object->data.seek_table;
-
-	if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + 1))
-		return false;
-
-	seek_table->points[seek_table->num_points - 1].sample_number = sample_number;
-	seek_table->points[seek_table->num_points - 1].stream_offset = 0;
-	seek_table->points[seek_table->num_points - 1].frame_samples = 0;
-
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-	FLAC__ASSERT(0 != sample_numbers || num == 0);
-
-	if(num > 0) {
-		FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table;
-		unsigned i, j;
-
-		i = seek_table->num_points;
-
-		if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + num))
-			return false;
-
-		for(j = 0; j < num; i++, j++) {
-			seek_table->points[i].sample_number = sample_numbers[j];
-			seek_table->points[i].stream_offset = 0;
-			seek_table->points[i].frame_samples = 0;
-		}
-	}
-
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-	FLAC__ASSERT(total_samples > 0);
-
-	if(num > 0 && total_samples > 0) {
-		FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table;
-		unsigned i, j;
-
-		i = seek_table->num_points;
-
-		if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + num))
-			return false;
-
-		for(j = 0; j < num; i++, j++) {
-			seek_table->points[i].sample_number = total_samples * (FLAC__uint64)j / (FLAC__uint64)num;
-			seek_table->points[i].stream_offset = 0;
-			seek_table->points[i].frame_samples = 0;
-		}
-	}
-
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-	FLAC__ASSERT(samples > 0);
-	FLAC__ASSERT(total_samples > 0);
-
-	if(samples > 0 && total_samples > 0) {
-		FLAC__StreamMetadata_SeekTable *seek_table = &object->data.seek_table;
-		unsigned i, j;
-		FLAC__uint64 num, sample;
-
-		num = 1 + total_samples / samples; /* 1+ for the first sample at 0 */
-		/* now account for the fact that we don't place a seekpoint at "total_samples" since samples are number from 0: */
-		if(total_samples % samples == 0)
-			num--;
-
-		i = seek_table->num_points;
-
-		if(!FLAC__metadata_object_seektable_resize_points(object, seek_table->num_points + (unsigned)num))
-			return false;
-
-		sample = 0;
-		for(j = 0; j < num; i++, j++, sample += samples) {
-			seek_table->points[i].sample_number = sample;
-			seek_table->points[i].stream_offset = 0;
-			seek_table->points[i].frame_samples = 0;
-		}
-	}
-
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact)
-{
-	unsigned unique;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_SEEKTABLE);
-
-	unique = FLAC__format_seektable_sort(&object->data.seek_table);
-
-	return !compact || FLAC__metadata_object_seektable_resize_points(object, unique);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy)
-{
-	if(!FLAC__format_vorbiscomment_entry_value_is_legal(entry.entry, entry.length))
-		return false;
-	return vorbiscomment_set_entry_(object, &object->data.vorbis_comment.vendor_string, &entry, copy);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
-
-	if(0 == object->data.vorbis_comment.comments) {
-		FLAC__ASSERT(object->data.vorbis_comment.num_comments == 0);
-		if(0 == new_num_comments)
-			return true;
-		else if(0 == (object->data.vorbis_comment.comments = vorbiscomment_entry_array_new_(new_num_comments)))
-			return false;
-	}
-	else {
-		const size_t old_size = object->data.vorbis_comment.num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry);
-		const size_t new_size = new_num_comments * sizeof(FLAC__StreamMetadata_VorbisComment_Entry);
-
-		/* overflow check */
-		if((size_t)new_num_comments > SIZE_MAX / sizeof(FLAC__StreamMetadata_VorbisComment_Entry))
-			return false;
-
-		FLAC__ASSERT(object->data.vorbis_comment.num_comments > 0);
-
-		/* if shrinking, free the truncated entries */
-		if(new_num_comments < object->data.vorbis_comment.num_comments) {
-			unsigned i;
-			for(i = new_num_comments; i < object->data.vorbis_comment.num_comments; i++)
-				if(0 != object->data.vorbis_comment.comments[i].entry)
-					free(object->data.vorbis_comment.comments[i].entry);
-		}
-
-		if(new_size == 0) {
-			free(object->data.vorbis_comment.comments);
-			object->data.vorbis_comment.comments = 0;
-		}
-		else if(0 == (object->data.vorbis_comment.comments = (FLAC__StreamMetadata_VorbisComment_Entry*)realloc(object->data.vorbis_comment.comments, new_size)))
-			return false;
-
-		/* if growing, zero all the length/pointers of new elements */
-		if(new_size > old_size)
-			memset(object->data.vorbis_comment.comments + object->data.vorbis_comment.num_comments, 0, new_size - old_size);
-	}
-
-	object->data.vorbis_comment.num_comments = new_num_comments;
-
-	vorbiscomment_calculate_length_(object);
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(comment_num < object->data.vorbis_comment.num_comments);
-
-	if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length))
-		return false;
-	return vorbiscomment_set_entry_(object, &object->data.vorbis_comment.comments[comment_num], &entry, copy);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy)
-{
-	FLAC__StreamMetadata_VorbisComment *vc;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
-	FLAC__ASSERT(comment_num <= object->data.vorbis_comment.num_comments);
-
-	if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length))
-		return false;
-
-	vc = &object->data.vorbis_comment;
-
-	if(!FLAC__metadata_object_vorbiscomment_resize_comments(object, vc->num_comments+1))
-		return false;
-
-	/* move all comments >= comment_num forward one space */
-	memmove(&vc->comments[comment_num+1], &vc->comments[comment_num], sizeof(FLAC__StreamMetadata_VorbisComment_Entry)*(vc->num_comments-1-comment_num));
-	vc->comments[comment_num].length = 0;
-	vc->comments[comment_num].entry = 0;
-
-	return FLAC__metadata_object_vorbiscomment_set_comment(object, comment_num, entry, copy);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
-	return FLAC__metadata_object_vorbiscomment_insert_comment(object, object->data.vorbis_comment.num_comments, entry, copy);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy)
-{
-	FLAC__ASSERT(0 != entry.entry && entry.length > 0);
-
-	if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length))
-		return false;
-
-	{
-		int i;
-		size_t field_name_length;
-		const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length);
-
-		FLAC__ASSERT(0 != eq);
-
-		if(0 == eq)
-			return false; /* double protection */
-
-		field_name_length = eq-entry.entry;
-
-		if((i = vorbiscomment_find_entry_from_(object, 0, (const char *)entry.entry, field_name_length)) >= 0) {
-			unsigned index = (unsigned)i;
-			if(!FLAC__metadata_object_vorbiscomment_set_comment(object, index, entry, copy))
-				return false;
-			if(all && (index+1 < object->data.vorbis_comment.num_comments)) {
-				for(i = vorbiscomment_find_entry_from_(object, index+1, (const char *)entry.entry, field_name_length); i >= 0; ) {
-					if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, (unsigned)i))
-						return false;
-					if((unsigned)i < object->data.vorbis_comment.num_comments)
-						i = vorbiscomment_find_entry_from_(object, (unsigned)i, (const char *)entry.entry, field_name_length);
-					else
-						i = -1;
-				}
-			}
-			return true;
-		}
-		else
-			return FLAC__metadata_object_vorbiscomment_append_comment(object, entry, copy);
-	}
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num)
-{
-	FLAC__StreamMetadata_VorbisComment *vc;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
-	FLAC__ASSERT(comment_num < object->data.vorbis_comment.num_comments);
-
-	vc = &object->data.vorbis_comment;
-
-	/* free the comment at comment_num */
-	if(0 != vc->comments[comment_num].entry)
-		free(vc->comments[comment_num].entry);
-
-	/* move all comments > comment_num backward one space */
-	memmove(&vc->comments[comment_num], &vc->comments[comment_num+1], sizeof(FLAC__StreamMetadata_VorbisComment_Entry)*(vc->num_comments-comment_num-1));
-	vc->comments[vc->num_comments-1].length = 0;
-	vc->comments[vc->num_comments-1].entry = 0;
-
-	return FLAC__metadata_object_vorbiscomment_resize_comments(object, vc->num_comments-1);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value)
-{
-	FLAC__ASSERT(0 != entry);
-	FLAC__ASSERT(0 != field_name);
-	FLAC__ASSERT(0 != field_value);
-
-	if(!FLAC__format_vorbiscomment_entry_name_is_legal(field_name))
-		return false;
-	if(!FLAC__format_vorbiscomment_entry_value_is_legal((const FLAC__byte *)field_value, (unsigned)(-1)))
-		return false;
-
-	{
-		const size_t nn = strlen(field_name);
-		const size_t nv = strlen(field_value);
-		entry->length = nn + 1 /*=*/ + nv;
-		if(0 == (entry->entry = (FLAC__byte*)safe_malloc_add_4op_(nn, /*+*/1, /*+*/nv, /*+*/1)))
-			return false;
-		memcpy(entry->entry, field_name, nn);
-		entry->entry[nn] = '=';
-		memcpy(entry->entry+nn+1, field_value, nv);
-		entry->entry[entry->length] = '\0';
-	}
-	
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value)
-{
-	FLAC__ASSERT(0 != entry.entry && entry.length > 0);
-	FLAC__ASSERT(0 != field_name);
-	FLAC__ASSERT(0 != field_value);
-
-	if(!FLAC__format_vorbiscomment_entry_is_legal(entry.entry, entry.length))
-		return false;
-
-	{
-		const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length);
-		const size_t nn = eq-entry.entry;
-		const size_t nv = entry.length-nn-1; /* -1 for the '=' */
-		FLAC__ASSERT(0 != eq);
-		if(0 == eq)
-			return false; /* double protection */
-		if(0 == (*field_name = (char*)safe_malloc_add_2op_(nn, /*+*/1)))
-			return false;
-		if(0 == (*field_value = (char*)safe_malloc_add_2op_(nv, /*+*/1))) {
-			free(*field_name);
-			return false;
-		}
-		memcpy(*field_name, entry.entry, nn);
-		memcpy(*field_value, entry.entry+nn+1, nv);
-		(*field_name)[nn] = '\0';
-		(*field_value)[nv] = '\0';
-	}
-
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length)
-{
-	FLAC__ASSERT(0 != entry.entry && entry.length > 0);
-	{
-		const FLAC__byte *eq = (FLAC__byte*)memchr(entry.entry, '=', entry.length);
-#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ || defined __EMX__
-#define FLAC__STRNCASECMP strnicmp
-#else
-#define FLAC__STRNCASECMP strncasecmp
-#endif
-		return (0 != eq && (unsigned)(eq-entry.entry) == field_name_length && 0 == FLAC__STRNCASECMP(field_name, (const char *)entry.entry, field_name_length));
-#undef FLAC__STRNCASECMP
-	}
-}
-
-FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name)
-{
-	FLAC__ASSERT(0 != field_name);
-
-	return vorbiscomment_find_entry_from_(object, offset, field_name, strlen(field_name));
-}
-
-FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name)
-{
-	const unsigned field_name_length = strlen(field_name);
-	unsigned i;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
-
-	for(i = 0; i < object->data.vorbis_comment.num_comments; i++) {
-		if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) {
-			if(!FLAC__metadata_object_vorbiscomment_delete_comment(object, i))
-				return -1;
-			else
-				return 1;
-		}
-	}
-
-	return 0;
-}
-
-FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name)
-{
-	FLAC__bool ok = true;
-	unsigned matching = 0;
-	const unsigned field_name_length = strlen(field_name);
-	int i;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT);
-
-	/* must delete from end to start otherwise it will interfere with our iteration */
-	for(i = (int)object->data.vorbis_comment.num_comments - 1; ok && i >= 0; i--) {
-		if(FLAC__metadata_object_vorbiscomment_entry_matches(object->data.vorbis_comment.comments[i], field_name, field_name_length)) {
-			matching++;
-			ok &= FLAC__metadata_object_vorbiscomment_delete_comment(object, (unsigned)i);
-		}
-	}
-
-	return ok? (int)matching : -1;
-}
-
-FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void)
-{
-	return (FLAC__StreamMetadata_CueSheet_Track*)calloc(1, sizeof(FLAC__StreamMetadata_CueSheet_Track));
-}
-
-FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object)
-{
-	FLAC__StreamMetadata_CueSheet_Track *to;
-
-	FLAC__ASSERT(0 != object);
-
-	if(0 != (to = FLAC__metadata_object_cuesheet_track_new())) {
-		if(!copy_track_(to, object)) {
-			FLAC__metadata_object_cuesheet_track_delete(to);
-			return 0;
-		}
-	}
-
-	return to;
-}
-
-void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object)
-{
-	FLAC__ASSERT(0 != object);
-
-	if(0 != object->indices) {
-		FLAC__ASSERT(object->num_indices > 0);
-		free(object->indices);
-	}
-}
-
-FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object)
-{
-	FLAC__metadata_object_cuesheet_track_delete_data(object);
-	free(object);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices)
-{
-	FLAC__StreamMetadata_CueSheet_Track *track;
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-	FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks);
-
-	track = &object->data.cue_sheet.tracks[track_num];
-
-	if(0 == track->indices) {
-		FLAC__ASSERT(track->num_indices == 0);
-		if(0 == new_num_indices)
-			return true;
-		else if(0 == (track->indices = cuesheet_track_index_array_new_(new_num_indices)))
-			return false;
-	}
-	else {
-		const size_t old_size = track->num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index);
-		const size_t new_size = new_num_indices * sizeof(FLAC__StreamMetadata_CueSheet_Index);
-
-		/* overflow check */
-		if((size_t)new_num_indices > SIZE_MAX / sizeof(FLAC__StreamMetadata_CueSheet_Index))
-			return false;
-
-		FLAC__ASSERT(track->num_indices > 0);
-
-		if(new_size == 0) {
-			free(track->indices);
-			track->indices = 0;
-		}
-		else if(0 == (track->indices = (FLAC__StreamMetadata_CueSheet_Index*)realloc(track->indices, new_size)))
-			return false;
-
-		/* if growing, zero all the lengths/pointers of new elements */
-		if(new_size > old_size)
-			memset(track->indices + track->num_indices, 0, new_size - old_size);
-	}
-
-	track->num_indices = new_num_indices;
-
-	cuesheet_calculate_length_(object);
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index index)
-{
-	FLAC__StreamMetadata_CueSheet_Track *track;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-	FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks);
-	FLAC__ASSERT(index_num <= object->data.cue_sheet.tracks[track_num].num_indices);
-
-	track = &object->data.cue_sheet.tracks[track_num];
-
-	if(!FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices+1))
-		return false;
-
-	/* move all indices >= index_num forward one space */
-	memmove(&track->indices[index_num+1], &track->indices[index_num], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-1-index_num));
-
-	track->indices[index_num] = index;
-	cuesheet_calculate_length_(object);
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num)
-{
-	FLAC__StreamMetadata_CueSheet_Index index;
-	memset(&index, 0, sizeof(index));
-	return FLAC__metadata_object_cuesheet_track_insert_index(object, track_num, index_num, index);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num)
-{
-	FLAC__StreamMetadata_CueSheet_Track *track;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-	FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks);
-	FLAC__ASSERT(index_num < object->data.cue_sheet.tracks[track_num].num_indices);
-
-	track = &object->data.cue_sheet.tracks[track_num];
-
-	/* move all indices > index_num backward one space */
-	memmove(&track->indices[index_num], &track->indices[index_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Index)*(track->num_indices-index_num-1));
-
-	FLAC__metadata_object_cuesheet_track_resize_indices(object, track_num, track->num_indices-1);
-	cuesheet_calculate_length_(object);
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-
-	if(0 == object->data.cue_sheet.tracks) {
-		FLAC__ASSERT(object->data.cue_sheet.num_tracks == 0);
-		if(0 == new_num_tracks)
-			return true;
-		else if(0 == (object->data.cue_sheet.tracks = cuesheet_track_array_new_(new_num_tracks)))
-			return false;
-	}
-	else {
-		const size_t old_size = object->data.cue_sheet.num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track);
-		const size_t new_size = new_num_tracks * sizeof(FLAC__StreamMetadata_CueSheet_Track);
-
-		/* overflow check */
-		if((size_t)new_num_tracks > SIZE_MAX / sizeof(FLAC__StreamMetadata_CueSheet_Track))
-			return false;
-
-		FLAC__ASSERT(object->data.cue_sheet.num_tracks > 0);
-
-		/* if shrinking, free the truncated entries */
-		if(new_num_tracks < object->data.cue_sheet.num_tracks) {
-			unsigned i;
-			for(i = new_num_tracks; i < object->data.cue_sheet.num_tracks; i++)
-				if(0 != object->data.cue_sheet.tracks[i].indices)
-					free(object->data.cue_sheet.tracks[i].indices);
-		}
-
-		if(new_size == 0) {
-			free(object->data.cue_sheet.tracks);
-			object->data.cue_sheet.tracks = 0;
-		}
-		else if(0 == (object->data.cue_sheet.tracks = (FLAC__StreamMetadata_CueSheet_Track*)realloc(object->data.cue_sheet.tracks, new_size)))
-			return false;
-
-		/* if growing, zero all the lengths/pointers of new elements */
-		if(new_size > old_size)
-			memset(object->data.cue_sheet.tracks + object->data.cue_sheet.num_tracks, 0, new_size - old_size);
-	}
-
-	object->data.cue_sheet.num_tracks = new_num_tracks;
-
-	cuesheet_calculate_length_(object);
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks);
-
-	return cuesheet_set_track_(object, object->data.cue_sheet.tracks + track_num, track, copy);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy)
-{
-	FLAC__StreamMetadata_CueSheet *cs;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-	FLAC__ASSERT(track_num <= object->data.cue_sheet.num_tracks);
-
-	cs = &object->data.cue_sheet;
-
-	if(!FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks+1))
-		return false;
-
-	/* move all tracks >= track_num forward one space */
-	memmove(&cs->tracks[track_num+1], &cs->tracks[track_num], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-1-track_num));
-	cs->tracks[track_num].num_indices = 0;
-	cs->tracks[track_num].indices = 0;
-
-	return FLAC__metadata_object_cuesheet_set_track(object, track_num, track, copy);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num)
-{
-	FLAC__StreamMetadata_CueSheet_Track track;
-	memset(&track, 0, sizeof(track));
-	return FLAC__metadata_object_cuesheet_insert_track(object, track_num, &track, /*copy=*/false);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num)
-{
-	FLAC__StreamMetadata_CueSheet *cs;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-	FLAC__ASSERT(track_num < object->data.cue_sheet.num_tracks);
-
-	cs = &object->data.cue_sheet;
-
-	/* free the track at track_num */
-	if(0 != cs->tracks[track_num].indices)
-		free(cs->tracks[track_num].indices);
-
-	/* move all tracks > track_num backward one space */
-	memmove(&cs->tracks[track_num], &cs->tracks[track_num+1], sizeof(FLAC__StreamMetadata_CueSheet_Track)*(cs->num_tracks-track_num-1));
-	cs->tracks[cs->num_tracks-1].num_indices = 0;
-	cs->tracks[cs->num_tracks-1].indices = 0;
-
-	return FLAC__metadata_object_cuesheet_resize_tracks(object, cs->num_tracks-1);
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-
-	return FLAC__format_cuesheet_is_legal(&object->data.cue_sheet, check_cd_da_subset, violation);
-}
-
-static FLAC__uint64 get_index_01_offset_(const FLAC__StreamMetadata_CueSheet *cs, unsigned track)
-{
-	if (track >= (cs->num_tracks-1) || cs->tracks[track].num_indices < 1)
-		return 0;
-	else if (cs->tracks[track].indices[0].number == 1)
-		return cs->tracks[track].indices[0].offset + cs->tracks[track].offset + cs->lead_in;
-	else if (cs->tracks[track].num_indices < 2)
-		return 0;
-	else if (cs->tracks[track].indices[1].number == 1)
-		return cs->tracks[track].indices[1].offset + cs->tracks[track].offset + cs->lead_in;
-	else
-		return 0;
-}
-
-static FLAC__uint32 cddb_add_digits_(FLAC__uint32 x)
-{
-	FLAC__uint32 n = 0;
-	while (x) {
-		n += (x%10);
-		x /= 10;
-	}
-	return n;
-}
-
-/*@@@@add to tests*/
-FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object)
-{
-	const FLAC__StreamMetadata_CueSheet *cs;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_CUESHEET);
-
-	cs = &object->data.cue_sheet;
-
-	if (cs->num_tracks < 2) /* need at least one real track and the lead-out track */
-		return 0;
-
-	{
-		FLAC__uint32 i, length, sum = 0;
-		for (i = 0; i < (cs->num_tracks-1); i++) /* -1 to avoid counting the lead-out */
-			sum += cddb_add_digits_((FLAC__uint32)(get_index_01_offset_(cs, i) / 44100));
-		length = (FLAC__uint32)((cs->tracks[cs->num_tracks-1].offset+cs->lead_in) / 44100) - (FLAC__uint32)(get_index_01_offset_(cs, 0) / 44100);
-
-		return (sum % 0xFF) << 24 | length << 8 | (FLAC__uint32)(cs->num_tracks-1);
-	}
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy)
-{
-	char *old;
-	size_t old_length, new_length;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE);
-	FLAC__ASSERT(0 != mime_type);
-
-	old = object->data.picture.mime_type;
-	old_length = old? strlen(old) : 0;
-	new_length = strlen(mime_type);
-
-	/* do the copy first so that if we fail we leave the object untouched */
-	if(copy) {
-		if(new_length >= SIZE_MAX) /* overflow check */
-			return false;
-		if(!copy_bytes_((FLAC__byte**)(&object->data.picture.mime_type), (FLAC__byte*)mime_type, new_length+1))
-			return false;
-	}
-	else {
-		object->data.picture.mime_type = mime_type;
-	}
-
-	if(0 != old)
-		free(old);
-
-	object->length -= old_length;
-	object->length += new_length;
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy)
-{
-	FLAC__byte *old;
-	size_t old_length, new_length;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE);
-	FLAC__ASSERT(0 != description);
-
-	old = object->data.picture.description;
-	old_length = old? strlen((const char *)old) : 0;
-	new_length = strlen((const char *)description);
-
-	/* do the copy first so that if we fail we leave the object untouched */
-	if(copy) {
-		if(new_length >= SIZE_MAX) /* overflow check */
-			return false;
-		if(!copy_bytes_(&object->data.picture.description, description, new_length+1))
-			return false;
-	}
-	else {
-		object->data.picture.description = description;
-	}
-
-	if(0 != old)
-		free(old);
-
-	object->length -= old_length;
-	object->length += new_length;
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy)
-{
-	FLAC__byte *old;
-
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE);
-	FLAC__ASSERT((0 != data && length > 0) || (0 == data && length == 0 && copy == false));
-
-	old = object->data.picture.data;
-
-	/* do the copy first so that if we fail we leave the object untouched */
-	if(copy) {
-		if(!copy_bytes_(&object->data.picture.data, data, length))
-			return false;
-	}
-	else {
-		object->data.picture.data = data;
-	}
-
-	if(0 != old)
-		free(old);
-
-	object->length -= object->data.picture.data_length;
-	object->data.picture.data_length = length;
-	object->length += length;
-	return true;
-}
-
-FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation)
-{
-	FLAC__ASSERT(0 != object);
-	FLAC__ASSERT(object->type == FLAC__METADATA_TYPE_PICTURE);
-
-	return FLAC__format_picture_is_legal(&object->data.picture, violation);
-}
diff --git a/libFLAC/ogg_decoder_aspect.c b/libFLAC/ogg_decoder_aspect.c
deleted file mode 100644
index 6974de3..0000000
--- a/libFLAC/ogg_decoder_aspect.c
+++ /dev/null
@@ -1,253 +0,0 @@
-/* libFLAC - Free Lossless Audio Codec
- * Copyright (C) 2002,2003,2004,2005,2006,2007  Josh Coalson
- *
- * Redistribution and use 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 the Xiph.org Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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 FOUNDATION 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.
- */
-
-#if HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <string.h> /* for memcpy() */
-#include "FLAC/assert.h"
-#include "private/ogg_decoder_aspect.h"
-#include "private/ogg_mapping.h"
-
-#ifdef max
-#undef max
-#endif
-#define max(x,y) ((x)>(y)?(x):(y))
-
-/***********************************************************************
- *
- * Public class methods
- *
- ***********************************************************************/
-
-FLAC__bool FLAC__ogg_decoder_aspect_init(FLAC__OggDecoderAspect *aspect)
-{
-	/* we will determine the serial number later if necessary */
-	if(ogg_stream_init(&aspect->stream_state, aspect->serial_number) != 0)
-		return false;
-
-	if(ogg_sync_init(&aspect->sync_state) != 0)
-		return false;
-
-	aspect->version_major = ~(0u);
-	aspect->version_minor = ~(0u);
-
-	aspect->need_serial_number = aspect->use_first_serial_number;
-
-	aspect->end_of_stream = false;
-	aspect->have_working_page = false;
-
-	return true;
-}
-
-void FLAC__ogg_decoder_aspect_finish(FLAC__OggDecoderAspect *aspect)
-{
-	(void)ogg_sync_clear(&aspect->sync_state);
-	(void)ogg_stream_clear(&aspect->stream_state);
-}
-
-void FLAC__ogg_decoder_aspect_set_serial_number(FLAC__OggDecoderAspect *aspect, long value)
-{
-	aspect->use_first_serial_number = false;
-	aspect->serial_number = value;
-}
-
-void FLAC__ogg_decoder_aspect_set_defaults(FLAC__OggDecoderAspect *aspect)
-{
-	aspect->use_first_serial_number = true;
-}
-
-void FLAC__ogg_decoder_aspect_flush(FLAC__OggDecoderAspect *aspect)
-{
-	(void)ogg_stream_reset(&aspect->stream_state);
-	(void)ogg_sync_reset(&aspect->sync_state);
-	aspect->end_of_stream = false;
-	aspect->have_working_page = false;
-}
-
-void FLAC__ogg_decoder_aspect_reset(FLAC__OggDecoderAspect *aspect)
-{
-	FLAC__ogg_decoder_aspect_flush(aspect);
-
-	if(aspect->use_first_serial_number)
-		aspect->need_serial_number = true;
-}
-
-FLAC__OggDecoderAspectReadStatus FLAC__ogg_decoder_aspect_read_callback_wrapper(FLAC__OggDecoderAspect *aspect, FLAC__byte buffer[], size_t *bytes, FLAC__OggDecoderAspectReadCallbackProxy read_callback, const FLAC__StreamDecoder *decoder, void *client_data)
-{
-	static const size_t OGG_BYTES_CHUNK = 8192;
-	const size_t bytes_requested = *bytes;
-
-	/*
-	 * The FLAC decoding API uses pull-based reads, whereas Ogg decoding
-	 * is push-based.  In libFLAC, when you ask to decode a frame, the
-	 * decoder will eventually call the read callback to supply some data,
-	 * but how much it asks for depends on how much free space it has in
-	 * its internal buffer.  It does not try to grow its internal buffer
-	 * to accomodate a whole frame because then the internal buffer size
-	 * could not be limited, which is necessary in embedded applications.
-	 *
-	 * Ogg however grows its internal buffer until a whole page is present;
-	 * only then can you get decoded data out.  So we can't just ask for
-	 * the same number of bytes from Ogg, then pass what's decoded down to
-	 * libFLAC.  If what libFLAC is asking for will not contain a whole
-	 * page, then we will get no data from ogg_sync_pageout(), and at the
-	 * same time cannot just read more data from the client for the purpose
-	 * of getting a whole decoded page because the decoded size might be
-	 * larger than libFLAC's internal buffer.
-	 *
-	 * Instead, whenever this read callback wrapper is called, we will
-	 * continually request data from the client until we have at least one
-	 * page, and manage pages internally so that we can send pieces of
-	 * pages down to libFLAC in such a way that we obey its size
-	 * requirement.  To limit the amount of callbacks, we will always try
-	 * to read in enough pages to return the full number of bytes
-	 * requested.
-	 */
-	*bytes = 0;
-	while (*bytes < bytes_requested && !aspect->end_of_stream) {
-		if (aspect->have_working_page) {
-			if (aspect->have_working_packet) {
-				size_t n = bytes_requested - *bytes;
-				if ((size_t)aspect->working_packet.bytes <= n) {
-					/* the rest of the packet will fit in the buffer */
-					n = aspect->working_packet.bytes;
-					memcpy(buffer, aspect->working_packet.packet, n);
-					*bytes += n;
-					buffer += n;
-					aspect->have_working_packet = false;
-				}
-				else {
-					/* only n bytes of the packet will fit in the buffer */
-					memcpy(buffer, aspect->working_packet.packet, n);
-					*bytes += n;
-					buffer += n;
-					aspect->working_packet.packet += n;
-					aspect->working_packet.bytes -= n;
-				}
-			}
-			else {
-				/* try and get another packet */
-				const int ret = ogg_stream_packetout(&aspect->stream_state, &aspect->working_packet);
-				if (ret > 0) {
-					aspect->have_working_packet = true;
-					/* if it is the first header packet, check for magic and a supported Ogg FLAC mapping version */
-					if (aspect->working_packet.bytes > 0 && aspect->working_packet.packet[0] == FLAC__OGG_MAPPING_FIRST_HEADER_PACKET_TYPE) {
-						const FLAC__byte *b = aspect->working_packet.packet;
-						const unsigned header_length =
-							FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH +
-							FLAC__OGG_MAPPING_MAGIC_LENGTH +
-							FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH +
-							FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH +
-							FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH;
-						if (aspect->working_packet.bytes < (long)header_length)
-							return FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC;
-						b += FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH;
-						if (memcmp(b, FLAC__OGG_MAPPING_MAGIC, FLAC__OGG_MAPPING_MAGIC_LENGTH))
-							return FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC;
-						b += FLAC__OGG_MAPPING_MAGIC_LENGTH;
-						aspect->version_major = (unsigned)(*b);
-						b += FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH;
-						aspect->version_minor = (unsigned)(*b);
-						if (aspect->version_major != 1)
-							return FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION;
-						aspect->working_packet.packet += header_length;
-						aspect->working_packet.bytes -= header_length;
-					}
-				}
-				else if (ret == 0) {
-					aspect->have_working_page = false;
-				}
-				else { /* ret < 0 */
-					/* lost sync, we'll leave the working page for the next call */
-					return FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC;
-				}
-			}
-		}
-		else {
-			/* try and get another page */
-			const int ret = ogg_sync_pageout(&aspect->sync_state, &aspect->working_page);
-			if (ret > 0) {
-				/* got a page, grab the serial number if necessary */
-				if(aspect->need_serial_number) {
-					aspect->stream_state.serialno = aspect->serial_number = ogg_page_serialno(&aspect->working_page);
-					aspect->need_serial_number = false;
-				}
-				if(ogg_stream_pagein(&aspect->stream_state, &aspect->working_page) == 0) {
-					aspect->have_working_page = true;
-					aspect->have_working_packet = false;
-				}
-				/* else do nothing, could be a page from another stream */
-			}
-			else if (ret == 0) {
-				/* need more data */
-				const size_t ogg_bytes_to_read = max(bytes_requested - *bytes, OGG_BYTES_CHUNK);
-				char *oggbuf = ogg_sync_buffer(&aspect->sync_state, ogg_bytes_to_read);
-
-				if(0 == oggbuf) {
-					return FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR;
-				}
-				else {
-					size_t ogg_bytes_read = ogg_bytes_to_read;
-
-					switch(read_callback(decoder, (FLAC__byte*)oggbuf, &ogg_bytes_read, client_data)) {
-						case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK:
-							break;
-						case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM:
-							aspect->end_of_stream = true;
-							break;
-						case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT:
-							return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT;
-						default:
-							FLAC__ASSERT(0);
-					}
-
-					if(ogg_sync_wrote(&aspect->sync_state, ogg_bytes_read) < 0) {
-						/* double protection; this will happen if the read callback returns more bytes than the max requested, which would overflow Ogg's internal buffer */
-						FLAC__ASSERT(0);
-						return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR;
-					}
-				}
-			}
-			else { /* ret < 0 */
-				/* lost sync, bail out */
-				return FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC;
-			}
-		}
-	}
-
-	if (aspect->end_of_stream && *bytes == 0) {
-		return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM;
-	}
-
-	return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK;
-}
diff --git a/libFLAC/ogg_encoder_aspect.c b/libFLAC/ogg_encoder_aspect.c
deleted file mode 100644
index 37df089..0000000
--- a/libFLAC/ogg_encoder_aspect.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/* libFLAC - Free Lossless Audio Codec
- * Copyright (C) 2002,2003,2004,2005,2006,2007  Josh Coalson
- *
- * Redistribution and use 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 the Xiph.org Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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 FOUNDATION 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.
- */
-
-#if HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <string.h> /* for memset() */
-#include "FLAC/assert.h"
-#include "private/ogg_encoder_aspect.h"
-#include "private/ogg_mapping.h"
-
-static const FLAC__byte FLAC__OGG_MAPPING_VERSION_MAJOR = 1;
-static const FLAC__byte FLAC__OGG_MAPPING_VERSION_MINOR = 0;
-
-/***********************************************************************
- *
- * Public class methods
- *
- ***********************************************************************/
-
-FLAC__bool FLAC__ogg_encoder_aspect_init(FLAC__OggEncoderAspect *aspect)
-{
-	/* we will determine the serial number later if necessary */
-	if(ogg_stream_init(&aspect->stream_state, aspect->serial_number) != 0)
-		return false;
-
-	aspect->seen_magic = false;
-	aspect->is_first_packet = true;
-	aspect->samples_written = 0;
-
-	return true;
-}
-
-void FLAC__ogg_encoder_aspect_finish(FLAC__OggEncoderAspect *aspect)
-{
-	(void)ogg_stream_clear(&aspect->stream_state);
-	/*@@@ what about the page? */
-}
-
-void FLAC__ogg_encoder_aspect_set_serial_number(FLAC__OggEncoderAspect *aspect, long value)
-{
-	aspect->serial_number = value;
-}
-
-FLAC__bool FLAC__ogg_encoder_aspect_set_num_metadata(FLAC__OggEncoderAspect *aspect, unsigned value)
-{
-	if(value < (1u << FLAC__OGG_MAPPING_NUM_HEADERS_LEN)) {
-		aspect->num_metadata = value;
-		return true;
-	}
-	else
-		return false;
-}
-
-void FLAC__ogg_encoder_aspect_set_defaults(FLAC__OggEncoderAspect *aspect)
-{
-	aspect->serial_number = 0;
-	aspect->num_metadata = 0;
-}
-
-/*
- * The basic FLAC -> Ogg mapping goes like this:
- *
- * - 'fLaC' magic and STREAMINFO block get combined into the first
- *   packet.  The packet is prefixed with
- *   + the one-byte packet type 0x7F
- *   + 'FLAC' magic
- *   + the 2 byte Ogg FLAC mapping version number
- *   + tne 2 byte big-endian # of header packets
- * - The first packet is flushed to the first page.
- * - Each subsequent metadata block goes into its own packet.
- * - Each metadata packet is flushed to page (this is not required,
- *   the mapping only requires that a flush must occur after all
- *   metadata is written).
- * - Each subsequent FLAC audio frame goes into its own packet.
- *
- * WATCHOUT:
- * This depends on the behavior of FLAC__StreamEncoder that we get a
- * separate write callback for the fLaC magic, and then separate write
- * callbacks for each metadata block and audio frame.
- */
-FLAC__StreamEncoderWriteStatus FLAC__ogg_encoder_aspect_write_callback_wrapper(FLAC__OggEncoderAspect *aspect, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, FLAC__bool is_last_block, FLAC__OggEncoderAspectWriteCallbackProxy write_callback, void *encoder, void *client_data)
-{
-	/* WATCHOUT:
-	 * This depends on the behavior of FLAC__StreamEncoder that 'samples'
-	 * will be 0 for metadata writes.
-	 */
-	const FLAC__bool is_metadata = (samples == 0);
-
-	/*
-	 * Treat fLaC magic packet specially.  We will note when we see it, then
-	 * wait until we get the STREAMINFO and prepend it in that packet
-	 */
-	if(aspect->seen_magic) {
-		ogg_packet packet;
-		FLAC__byte synthetic_first_packet_body[
-			FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH +
-			FLAC__OGG_MAPPING_MAGIC_LENGTH +
-			FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH +
-			FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH +
-			FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH +
-			FLAC__STREAM_SYNC_LENGTH +
-			FLAC__STREAM_METADATA_HEADER_LENGTH +
-			FLAC__STREAM_METADATA_STREAMINFO_LENGTH
-		];
-
-		memset(&packet, 0, sizeof(packet));
-		packet.granulepos = aspect->samples_written + samples;
-
-		if(aspect->is_first_packet) {
-			FLAC__byte *b = synthetic_first_packet_body;
-			if(bytes != FLAC__STREAM_METADATA_HEADER_LENGTH + FLAC__STREAM_METADATA_STREAMINFO_LENGTH) {
-				/*
-				 * If we get here, our assumption about the way write callbacks happen
-				 * (explained above) is wrong
-				 */
-				FLAC__ASSERT(0);
-				return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
-			}
-			/* add first header packet type */
-			*b = FLAC__OGG_MAPPING_FIRST_HEADER_PACKET_TYPE;
-			b += FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH;
-			/* add 'FLAC' mapping magic */
-			memcpy(b, FLAC__OGG_MAPPING_MAGIC, FLAC__OGG_MAPPING_MAGIC_LENGTH);
-			b += FLAC__OGG_MAPPING_MAGIC_LENGTH;
-			/* add Ogg FLAC mapping major version number */
-			memcpy(b, &FLAC__OGG_MAPPING_VERSION_MAJOR, FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH);
-			b += FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH;
-			/* add Ogg FLAC mapping minor version number */
-			memcpy(b, &FLAC__OGG_MAPPING_VERSION_MINOR, FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH);
-			b += FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH;
-			/* add number of header packets */
-			*b = (FLAC__byte)(aspect->num_metadata >> 8);
-			b++;
-			*b = (FLAC__byte)(aspect->num_metadata);
-			b++;
-			/* add native FLAC 'fLaC' magic */
-			memcpy(b, FLAC__STREAM_SYNC_STRING, FLAC__STREAM_SYNC_LENGTH);
-			b += FLAC__STREAM_SYNC_LENGTH;
-			/* add STREAMINFO */
-			memcpy(b, buffer, bytes);
-			FLAC__ASSERT(b + bytes - synthetic_first_packet_body == sizeof(synthetic_first_packet_body));
-			packet.packet = (unsigned char *)synthetic_first_packet_body;
-			packet.bytes = sizeof(synthetic_first_packet_body);
-
-			packet.b_o_s = 1;
-			aspect->is_first_packet = false;
-		}
-		else {
-			packet.packet = (unsigned char *)buffer;
-			packet.bytes = bytes;
-		}
-
-		if(is_last_block) {
-			/* we used to check:
-			 * FLAC__ASSERT(total_samples_estimate == 0 || total_samples_estimate == aspect->samples_written + samples);
-			 * but it's really not useful since total_samples_estimate is an estimate and can be inexact
-			 */
-			packet.e_o_s = 1;
-		}
-
-		if(ogg_stream_packetin(&aspect->stream_state, &packet) != 0)
-			return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
-
-		/*@@@ can't figure out a way to pass a useful number for 'samples' to the write_callback, so we'll just pass 0 */
-		if(is_metadata) {
-			while(ogg_stream_flush(&aspect->stream_state, &aspect->page) != 0) {
-				if(write_callback(encoder, aspect->page.header, aspect->page.header_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
-					return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
-				if(write_callback(encoder, aspect->page.body, aspect->page.body_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
-					return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
-			}
-		}
-		else {
-			while(ogg_stream_pageout(&aspect->stream_state, &aspect->page) != 0) {
-				if(write_callback(encoder, aspect->page.header, aspect->page.header_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
-					return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
-				if(write_callback(encoder, aspect->page.body, aspect->page.body_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
-					return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
-			}
-		}
-	}
-	else if(is_metadata && current_frame == 0 && samples == 0 && bytes == 4 && 0 == memcmp(buffer, FLAC__STREAM_SYNC_STRING, sizeof(FLAC__STREAM_SYNC_STRING))) {
-		aspect->seen_magic = true;
-	}
-	else {
-		/*
-		 * If we get here, our assumption about the way write callbacks happen
-		 * explained above is wrong
-		 */
-		FLAC__ASSERT(0);
-		return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
-	}
-
-	aspect->samples_written += samples;
-
-	return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
-}
diff --git a/libFLAC/ogg_helper.c b/libFLAC/ogg_helper.c
deleted file mode 100644
index 73f9f0b..0000000
--- a/libFLAC/ogg_helper.c
+++ /dev/null
@@ -1,209 +0,0 @@
-/* libFLAC - Free Lossless Audio Codec
- * Copyright (C) 2004,2005,2006,2007  Josh Coalson
- *
- * Redistribution and use 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 the Xiph.org Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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 FOUNDATION 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.
- */
-
-#if HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <stdlib.h> /* for malloc() */
-#include <string.h> /* for memcmp(), memcpy() */
-#include "FLAC/assert.h"
-#include "share/alloc.h"
-#include "private/ogg_helper.h"
-#include "protected/stream_encoder.h"
-
-
-static FLAC__bool full_read_(FLAC__StreamEncoder *encoder, FLAC__byte *buffer, size_t bytes, FLAC__StreamEncoderReadCallback read_callback, void *client_data)
-{
-	while(bytes > 0) {
-		size_t bytes_read = bytes;
-		switch(read_callback(encoder, buffer, &bytes_read, client_data)) {
-			case FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE:
-				bytes -= bytes_read;
-				buffer += bytes_read;
-				break;
-			case FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM:
-				if(bytes_read == 0) {
-					encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR;
-					return false;
-				}
-				bytes -= bytes_read;
-				buffer += bytes_read;
-				break;
-			case FLAC__STREAM_ENCODER_READ_STATUS_ABORT:
-				encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
-				return false;
-			case FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED:
-				return false;
-			default:
-				/* double protection: */
-				FLAC__ASSERT(0);
-				encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
-				return false;
-		}
-	}
-
-	return true;
-}
-
-void simple_ogg_page__init(ogg_page *page)
-{
-	page->header = 0;
-	page->header_len = 0;
-	page->body = 0;
-	page->body_len = 0;
-}
-
-void simple_ogg_page__clear(ogg_page *page)
-{
-	if(page->header)
-		free(page->header);
-	if(page->body)
-		free(page->body);
-	simple_ogg_page__init(page);
-}
-
-FLAC__bool simple_ogg_page__get_at(FLAC__StreamEncoder *encoder, FLAC__uint64 position, ogg_page *page, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderReadCallback read_callback, void *client_data)
-{
-	static const unsigned OGG_HEADER_FIXED_PORTION_LEN = 27;
-	static const unsigned OGG_MAX_HEADER_LEN = 27/*OGG_HEADER_FIXED_PORTION_LEN*/ + 255;
-	FLAC__byte crc[4];
-	FLAC__StreamEncoderSeekStatus seek_status;
-
-	FLAC__ASSERT(page->header == 0);
-	FLAC__ASSERT(page->header_len == 0);
-	FLAC__ASSERT(page->body == 0);
-	FLAC__ASSERT(page->body_len == 0);
-
-	/* move the stream pointer to the supposed beginning of the page */
-	if(0 == seek_callback)
-		return false;
-	if((seek_status = seek_callback((FLAC__StreamEncoder*)encoder, position, client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) {
-		if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR)
-			encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
-		return false;
-	}
-
-	/* allocate space for the page header */
-	if(0 == (page->header = (unsigned char *)safe_malloc_(OGG_MAX_HEADER_LEN))) {
-		encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
-		return false;
-	}
-
-	/* read in the fixed part of the page header (up to but not including
-	 * the segment table */
-	if(!full_read_(encoder, page->header, OGG_HEADER_FIXED_PORTION_LEN, read_callback, client_data))
-		return false;
-
-	page->header_len = OGG_HEADER_FIXED_PORTION_LEN + page->header[26];
-
-	/* check to see if it's a correct, "simple" page (one packet only) */
-	if(
-		memcmp(page->header, "OggS", 4) ||               /* doesn't start with OggS */
-		(page->header[5] & 0x01) ||                      /* continued packet */
-		memcmp(page->header+6, "\0\0\0\0\0\0\0\0", 8) || /* granulepos is non-zero */
-		page->header[26] == 0                            /* packet is 0-size */
-	) {
-		encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR;
-		return false;
-	}
-
-	/* read in the segment table */
-	if(!full_read_(encoder, page->header + OGG_HEADER_FIXED_PORTION_LEN, page->header[26], read_callback, client_data))
-		return false;
-
-	{
-		unsigned i;
-
-		/* check to see that it specifies a single packet */
-		for(i = 0; i < (unsigned)page->header[26] - 1; i++) {
-			if(page->header[i + OGG_HEADER_FIXED_PORTION_LEN] != 255) {
-				encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR;
-				return false;
-			}
-		}
-
-		page->body_len = 255 * i + page->header[i + OGG_HEADER_FIXED_PORTION_LEN];
-	}
-
-	/* allocate space for the page body */
-	if(0 == (page->body = (unsigned char *)safe_malloc_(page->body_len))) {
-		encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR;
-		return false;
-	}
-
-	/* read in the page body */
-	if(!full_read_(encoder, page->body, page->body_len, read_callback, client_data))
-		return false;
-
-	/* check the CRC */
-	memcpy(crc, page->header+22, 4);
-	ogg_page_checksum_set(page);
-	if(memcmp(crc, page->header+22, 4)) {
-		encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR;
-		return false;
-	}
-
-	return true;
-}
-
-FLAC__bool simple_ogg_page__set_at(FLAC__StreamEncoder *encoder, FLAC__uint64 position, ogg_page *page, FLAC__StreamEncoderSeekCallback seek_callback, FLAC__StreamEncoderWriteCallback write_callback, void *client_data)
-{
-	FLAC__StreamEncoderSeekStatus seek_status;
-
-	FLAC__ASSERT(page->header != 0);
-	FLAC__ASSERT(page->header_len != 0);
-	FLAC__ASSERT(page->body != 0);
-	FLAC__ASSERT(page->body_len != 0);
-
-	/* move the stream pointer to the supposed beginning of the page */
-	if(0 == seek_callback)
-		return false;
-	if((seek_status = seek_callback((FLAC__StreamEncoder*)encoder, position, client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) {
-		if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR)
-			encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
-		return false;
-	}
-
-	ogg_page_checksum_set(page);
-
-	/* re-write the page */
-	if(write_callback((FLAC__StreamEncoder*)encoder, page->header, page->header_len, 0, 0, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
-		encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
-		return false;
-	}
-	if(write_callback((FLAC__StreamEncoder*)encoder, page->body, page->body_len, 0, 0, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) {
-		encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR;
-		return false;
-	}
-
-	return true;
-}
diff --git a/libFLAC/ogg_mapping.c b/libFLAC/ogg_mapping.c
deleted file mode 100644
index a518892..0000000
--- a/libFLAC/ogg_mapping.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* libFLAC - Free Lossless Audio Codec
- * Copyright (C) 2004,2005,2006,2007  Josh Coalson
- *
- * Redistribution and use 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 the Xiph.org Foundation nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * 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 FOUNDATION 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.
- */
-
-#if HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include "private/ogg_mapping.h"
-
-const unsigned FLAC__OGG_MAPPING_PACKET_TYPE_LEN = 8; /* bits */
-
-const FLAC__byte FLAC__OGG_MAPPING_FIRST_HEADER_PACKET_TYPE = 0x7f;
-
-const FLAC__byte * const FLAC__OGG_MAPPING_MAGIC = (const FLAC__byte * const)"FLAC";
-
-const unsigned FLAC__OGG_MAPPING_VERSION_MAJOR_LEN = 8; /* bits */
-const unsigned FLAC__OGG_MAPPING_VERSION_MINOR_LEN = 8; /* bits */
-
-const unsigned FLAC__OGG_MAPPING_NUM_HEADERS_LEN = 16; /* bits */
diff --git a/libFLAC/ppc/Makefile.am b/libFLAC/ppc/Makefile.am
deleted file mode 100644
index 87cd95c..0000000
--- a/libFLAC/ppc/Makefile.am
+++ /dev/null
@@ -1,31 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-SUBDIRS = as gas
diff --git a/libFLAC/ppc/Makefile.in b/libFLAC/ppc/Makefile.in
deleted file mode 100644
index 308a21b..0000000
--- a/libFLAC/ppc/Makefile.in
+++ /dev/null
@@ -1,533 +0,0 @@
-# Makefile.in generated by automake 1.7.9 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEBUG_FALSE = @DEBUG_FALSE@
-DEBUG_TRUE = @DEBUG_TRUE@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
-DOXYGEN = @DOXYGEN@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@
-FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@
-FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@
-FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@
-FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@
-FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@
-FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@
-FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@
-FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@
-FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@
-FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@
-FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@
-FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@
-FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@
-FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@
-FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@
-FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@
-FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@
-FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@
-FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@
-FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@
-FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@
-FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@
-FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@
-FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@
-FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@
-FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@
-FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@
-FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@
-FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@
-FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@
-FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@
-FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@
-FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@
-GAS = @GAS@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBICONV = @LTLIBICONV@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@
-NASM = @NASM@
-OBJEXT = @OBJEXT@
-OBJ_FORMAT = @OBJ_FORMAT@
-OGG_CFLAGS = @OGG_CFLAGS@
-OGG_LIBS = @OGG_LIBS@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XMMS_CFLAGS = @XMMS_CFLAGS@
-XMMS_CONFIG = @XMMS_CONFIG@
-XMMS_DATA_DIR = @XMMS_DATA_DIR@
-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@
-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@
-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@
-XMMS_LIBS = @XMMS_LIBS@
-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@
-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@
-XMMS_VERSION = @XMMS_VERSION@
-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-
-SUBDIRS = as gas
-subdir = src/libFLAC/ppc
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-DIST_SOURCES =
-
-RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \
-	ps-recursive install-info-recursive uninstall-info-recursive \
-	all-recursive install-data-recursive install-exec-recursive \
-	installdirs-recursive install-recursive uninstall-recursive \
-	check-recursive installcheck-recursive
-DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
-DIST_SUBDIRS = $(SUBDIRS)
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/libFLAC/ppc/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@set fnord $$MAKEFLAGS; amf=$$2; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
-	@set fnord $$MAKEFLAGS; amf=$$2; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if (etags --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	else \
-	  include_option=--include; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -f $$subdir/TAGS && \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ../../..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d $(distdir)/$$subdir \
-	    || mkdir $(distdir)/$$subdir \
-	    || exit 1; \
-	    (cd $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$(top_distdir)" \
-	        distdir=../$(distdir)/$$subdir \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile
-installdirs: installdirs-recursive
-installdirs-am:
-
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-libtool \
-	distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-recursive
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \
-	clean-generic clean-libtool clean-recursive ctags \
-	ctags-recursive distclean distclean-generic distclean-libtool \
-	distclean-recursive distclean-tags distdir dvi dvi-am \
-	dvi-recursive info info-am info-recursive install install-am \
-	install-data install-data-am install-data-recursive \
-	install-exec install-exec-am install-exec-recursive \
-	install-info install-info-am install-info-recursive install-man \
-	install-recursive install-strip installcheck installcheck-am \
-	installdirs installdirs-am installdirs-recursive \
-	maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-generic \
-	mostlyclean-libtool mostlyclean-recursive pdf pdf-am \
-	pdf-recursive ps ps-am ps-recursive tags tags-recursive \
-	uninstall uninstall-am uninstall-info-am \
-	uninstall-info-recursive uninstall-recursive
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libFLAC/ppc/as/Makefile.am b/libFLAC/ppc/as/Makefile.am
deleted file mode 100644
index 919938b..0000000
--- a/libFLAC/ppc/as/Makefile.am
+++ /dev/null
@@ -1,52 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-#@@@
-if FLaC__HAS_AS__TEMPORARILY_DISABLED
-
-SUFFIXES = .s .lo
-
-STRIP_NON_ASM = sh $(top_srcdir)/strip_non_asm_libtool_args.sh
-
-# For some unknown reason libtool can't figure out the tag for 'as', so
-# we fake it with --tag=CC and strip out unwanted options.
-.s.lo:
-	$(LIBTOOL) --tag=CC --mode=compile $(STRIP_NON_ASM) as -force_cpusubtype_ALL -o $@ $<
-
-noinst_LTLIBRARIES = libFLAC-asm.la
-libFLAC_asm_la_SOURCES = \
-	lpc_asm.s
-
-else
-
-EXTRA_DIST = \
-	lpc_asm.s
-
-endif
diff --git a/libFLAC/ppc/as/Makefile.in b/libFLAC/ppc/as/Makefile.in
deleted file mode 100644
index 1565e46..0000000
--- a/libFLAC/ppc/as/Makefile.in
+++ /dev/null
@@ -1,503 +0,0 @@
-# Makefile.in generated by automake 1.7.9 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../../..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEBUG_FALSE = @DEBUG_FALSE@
-DEBUG_TRUE = @DEBUG_TRUE@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
-DOXYGEN = @DOXYGEN@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@
-FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@
-FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@
-FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@
-FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@
-FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@
-FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@
-FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@
-FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@
-FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@
-FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@
-FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@
-FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@
-FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@
-FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@
-FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@
-FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@
-FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@
-FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@
-FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@
-FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@
-FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@
-FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@
-FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@
-FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@
-FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@
-FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@
-FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@
-FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@
-FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@
-FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@
-FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@
-FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@
-FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@
-GAS = @GAS@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBICONV = @LTLIBICONV@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@
-NASM = @NASM@
-OBJEXT = @OBJEXT@
-OBJ_FORMAT = @OBJ_FORMAT@
-OGG_CFLAGS = @OGG_CFLAGS@
-OGG_LIBS = @OGG_LIBS@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XMMS_CFLAGS = @XMMS_CFLAGS@
-XMMS_CONFIG = @XMMS_CONFIG@
-XMMS_DATA_DIR = @XMMS_DATA_DIR@
-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@
-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@
-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@
-XMMS_LIBS = @XMMS_LIBS@
-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@
-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@
-XMMS_VERSION = @XMMS_VERSION@
-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-
-
-#@@@
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@SUFFIXES = .s .lo
-
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@STRIP_NON_ASM = sh $(top_srcdir)/strip_non_asm_libtool_args.sh
-
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@noinst_LTLIBRARIES = libFLAC-asm.la
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@libFLAC_asm_la_SOURCES = \
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@	lpc_asm.s
-
-
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@EXTRA_DIST = \
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@	lpc_asm.s
-
-subdir = src/libFLAC/ppc/as
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-
-libFLAC_asm_la_LDFLAGS =
-libFLAC_asm_la_LIBADD =
-am__libFLAC_asm_la_SOURCES_DIST = lpc_asm.s
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@am_libFLAC_asm_la_OBJECTS = \
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@	lpc_asm.lo
-libFLAC_asm_la_OBJECTS = $(am_libFLAC_asm_la_OBJECTS)
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)
-CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)
-LTCCASCOMPILE = $(LIBTOOL) --mode=compile $(CCAS) $(AM_CCASFLAGS) \
-	$(CCASFLAGS)
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
-	$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(am__libFLAC_asm_la_SOURCES_DIST)
-DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
-SOURCES = $(libFLAC_asm_la_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .lo .o .obj .s
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/libFLAC/ppc/as/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-clean-noinstLTLIBRARIES:
-	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" = "$$p" && dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libFLAC-asm.la: $(libFLAC_asm_la_OBJECTS) $(libFLAC_asm_la_DEPENDENCIES) 
-	$(LINK)  $(libFLAC_asm_la_LDFLAGS) $(libFLAC_asm_la_OBJECTS) $(libFLAC_asm_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.s.o:
-	$(CCASCOMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.s.obj:
-	$(CCASCOMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@.s.lo:
-	$(LTCCASCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ../../../..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES)
-
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstLTLIBRARIES ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am info info-am install \
-	install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool pdf \
-	pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am
-
-
-# For some unknown reason libtool can't figure out the tag for 'as', so
-# we fake it with --tag=CC and strip out unwanted options.
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@.s.lo:
-@FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@	$(LIBTOOL) --tag=CC --mode=compile $(STRIP_NON_ASM) as -force_cpusubtype_ALL -o $@ $<
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libFLAC/ppc/as/lpc_asm.s b/libFLAC/ppc/as/lpc_asm.s
deleted file mode 100644
index ca39c6f..0000000
--- a/libFLAC/ppc/as/lpc_asm.s
+++ /dev/null
@@ -1,429 +0,0 @@
-;  libFLAC - Free Lossless Audio Codec library
-;  Copyright (C) 2004,2005,2006,2007  Josh Coalson
-;
-;  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-;  contributors may be used to endorse or promote products derived from
-;  this software without specific prior written permission.
-;
-;  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 FOUNDATION 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.
-
-.text
-	.align 2
-.globl _FLAC__lpc_restore_signal_asm_ppc_altivec_16
-
-.globl _FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8
-
-_FLAC__lpc_restore_signal_asm_ppc_altivec_16:
-;	r3: residual[]
-;	r4: data_len
-;	r5: qlp_coeff[]
-;	r6: order
-;	r7: lp_quantization
-;	r8: data[]
-
-; see src/libFLAC/lpc.c:FLAC__lpc_restore_signal()
-; these is a PowerPC/Altivec assembly version which requires bps<=16 (or actual
-; bps<=15 for mid-side coding, since that uses an extra bit)
-
-; these should be fast; the inner loop is unrolled (it takes no more than
-; 3*(order%4) instructions, all of which are arithmetic), and all of the
-; coefficients and all relevant history stay in registers, so the outer loop
-; has only one load from memory (the residual)
-
-; I have not yet run this through simg4, so there may be some avoidable stalls,
-; and there may be a somewhat more clever way to do the outer loop
-
-; the branch mechanism may prevent dynamic loading; I still need to examine
-; this issue, and there may be a more elegant method
-
-	stmw r31,-4(r1)
-
-	addi r9,r1,-28
-	li r31,0xf
-	andc r9,r9,r31 ; for quadword-aligned stack data
-
-	slwi r6,r6,2 ; adjust for word size
-	slwi r4,r4,2
-	add r4,r4,r8 ; r4 = data+data_len
-
-	mfspr r0,256 ; cache old vrsave
-	addis r31,0,hi16(0xfffffc00)
-	ori r31,r31,lo16(0xfffffc00)
-	mtspr 256,r31 ; declare VRs in vrsave
-
-	cmplw cr0,r8,r4 ; i<data_len
-	bc 4,0,L1400
-
-	; load coefficients into v0-v7 and initial history into v8-v15
-	li r31,0xf
-	and r31,r8,r31 ; r31: data%4
-	li r11,16
-	subf r31,r31,r11 ; r31: 4-(data%4)
-	slwi r31,r31,3 ; convert to bits for vsro
-	li r10,-4
-	stw r31,-4(r9)
-	lvewx v0,r10,r9
-	vspltisb v18,-1
-	vsro v18,v18,v0 ; v18: mask vector
-
-	li r31,0x8
-	lvsl v0,0,r31
-	vsldoi v0,v0,v0,12
-	li r31,0xc
-	lvsl v1,0,r31
-	vspltisb v2,0
-	vspltisb v3,-1
-	vmrglw v2,v2,v3
-	vsel v0,v1,v0,v2 ; v0: reversal permutation vector
-
-	add r10,r5,r6
-	lvsl v17,0,r5 ; v17: coefficient alignment permutation vector
-	vperm v17,v17,v17,v0 ; v17: reversal coefficient alignment permutation vector
-
-	mr r11,r8
-	lvsl v16,0,r11 ; v16: history alignment permutation vector
-
-	lvx v0,0,r5
-	addi r5,r5,16
-	lvx v1,0,r5
-	vperm v0,v0,v1,v17
-	lvx v8,0,r11
-	addi r11,r11,-16
-	lvx v9,0,r11
-	vperm v8,v9,v8,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1101
-	vand v0,v0,v18
-	addis r31,0,hi16(L1307)
-	ori r31,r31,lo16(L1307)
-	b L1199
-
-L1101:
-	addi r5,r5,16
-	lvx v2,0,r5
-	vperm v1,v1,v2,v17
-	addi r11,r11,-16
-	lvx v10,0,r11
-	vperm v9,v10,v9,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1102
-	vand v1,v1,v18
-	addis r31,0,hi16(L1306)
-	ori r31,r31,lo16(L1306)
-	b L1199
-
-L1102:
-	addi r5,r5,16
-	lvx v3,0,r5
-	vperm v2,v2,v3,v17
-	addi r11,r11,-16
-	lvx v11,0,r11
-	vperm v10,v11,v10,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1103
-	vand v2,v2,v18
-	addis r31,0,hi16(L1305)
-	ori r31,r31,lo16(L1305)
-	b L1199
-
-L1103:
-	addi r5,r5,16
-	lvx v4,0,r5
-	vperm v3,v3,v4,v17
-	addi r11,r11,-16
-	lvx v12,0,r11
-	vperm v11,v12,v11,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1104
-	vand v3,v3,v18
-	addis r31,0,hi16(L1304)
-	ori r31,r31,lo16(L1304)
-	b L1199
-
-L1104:
-	addi r5,r5,16
-	lvx v5,0,r5
-	vperm v4,v4,v5,v17
-	addi r11,r11,-16
-	lvx v13,0,r11
-	vperm v12,v13,v12,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1105
-	vand v4,v4,v18
-	addis r31,0,hi16(L1303)
-	ori r31,r31,lo16(L1303)
-	b L1199
-
-L1105:
-	addi r5,r5,16
-	lvx v6,0,r5
-	vperm v5,v5,v6,v17
-	addi r11,r11,-16
-	lvx v14,0,r11
-	vperm v13,v14,v13,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1106
-	vand v5,v5,v18
-	addis r31,0,hi16(L1302)
-	ori r31,r31,lo16(L1302)
-	b L1199
-
-L1106:
-	addi r5,r5,16
-	lvx v7,0,r5
-	vperm v6,v6,v7,v17
-	addi r11,r11,-16
-	lvx v15,0,r11
-	vperm v14,v15,v14,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1107
-	vand v6,v6,v18
-	addis r31,0,hi16(L1301)
-	ori r31,r31,lo16(L1301)
-	b L1199
-
-L1107:
-	addi r5,r5,16
-	lvx v19,0,r5
-	vperm v7,v7,v19,v17
-	addi r11,r11,-16
-	lvx v19,0,r11
-	vperm v15,v19,v15,v16
-	vand v7,v7,v18
-	addis r31,0,hi16(L1300)
-	ori r31,r31,lo16(L1300)
-
-L1199:
-	mtctr r31
-
-	; set up invariant vectors
-	vspltish v16,0 ; v16: zero vector
-
-	li r10,-12
-	lvsr v17,r10,r8 ; v17: result shift vector
-	lvsl v18,r10,r3 ; v18: residual shift back vector
-
-	li r10,-4
-	stw r7,-4(r9)
-	lvewx v19,r10,r9 ; v19: lp_quantization vector
-
-L1200:
-	vmulosh v20,v0,v8 ; v20: sum vector
-	bcctr 20,0
-
-L1300:
-	vmulosh v21,v7,v15
-	vsldoi v15,v15,v14,4 ; increment history
-	vaddsws v20,v20,v21
-
-L1301:
-	vmulosh v21,v6,v14
-	vsldoi v14,v14,v13,4
-	vaddsws v20,v20,v21
-
-L1302:
-	vmulosh v21,v5,v13
-	vsldoi v13,v13,v12,4
-	vaddsws v20,v20,v21
-
-L1303:
-	vmulosh v21,v4,v12
-	vsldoi v12,v12,v11,4
-	vaddsws v20,v20,v21
-
-L1304:
-	vmulosh v21,v3,v11
-	vsldoi v11,v11,v10,4
-	vaddsws v20,v20,v21
-
-L1305:
-	vmulosh v21,v2,v10
-	vsldoi v10,v10,v9,4
-	vaddsws v20,v20,v21
-
-L1306:
-	vmulosh v21,v1,v9
-	vsldoi v9,v9,v8,4
-	vaddsws v20,v20,v21
-
-L1307:
-	vsumsws v20,v20,v16 ; v20[3]: sum
-	vsraw v20,v20,v19 ; v20[3]: sum >> lp_quantization
-
-	lvewx v21,0,r3 ; v21[n]: *residual
-	vperm v21,v21,v21,v18 ; v21[3]: *residual
-	vaddsws v20,v21,v20 ; v20[3]: *residual + (sum >> lp_quantization)
-	vsldoi v18,v18,v18,4 ; increment shift vector
-
-	vperm v21,v20,v20,v17 ; v21[n]: shift for storage
-	vsldoi v17,v17,v17,12 ; increment shift vector
-	stvewx v21,0,r8
-
-	vsldoi v20,v20,v20,12
-	vsldoi v8,v8,v20,4 ; insert value onto history
-
-	addi r3,r3,4
-	addi r8,r8,4
-	cmplw cr0,r8,r4 ; i<data_len
-	bc 12,0,L1200
-
-L1400:
-	mtspr 256,r0 ; restore old vrsave
-	lmw r31,-4(r1)
-	blr
-
-_FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8:
-;	r3: residual[]
-;	r4: data_len
-;	r5: qlp_coeff[]
-;	r6: order
-;	r7: lp_quantization
-;	r8: data[]
-
-; see _FLAC__lpc_restore_signal_asm_ppc_altivec_16() above
-; this version assumes order<=8; it uses fewer vector registers, which should
-; save time in context switches, and has less code, which may improve
-; instruction caching
-
-	stmw r31,-4(r1)
-
-	addi r9,r1,-28
-	li r31,0xf
-	andc r9,r9,r31 ; for quadword-aligned stack data
-
-	slwi r6,r6,2 ; adjust for word size
-	slwi r4,r4,2
-	add r4,r4,r8 ; r4 = data+data_len
-
-	mfspr r0,256 ; cache old vrsave
-	addis r31,0,hi16(0xffc00000)
-	ori r31,r31,lo16(0xffc00000)
-	mtspr 256,r31 ; declare VRs in vrsave
-
-	cmplw cr0,r8,r4 ; i<data_len
-	bc 4,0,L2400
-
-	; load coefficients into v0-v1 and initial history into v2-v3
-	li r31,0xf
-	and r31,r8,r31 ; r31: data%4
-	li r11,16
-	subf r31,r31,r11 ; r31: 4-(data%4)
-	slwi r31,r31,3 ; convert to bits for vsro
-	li r10,-4
-	stw r31,-4(r9)
-	lvewx v0,r10,r9
-	vspltisb v6,-1
-	vsro v6,v6,v0 ; v6: mask vector
-
-	li r31,0x8
-	lvsl v0,0,r31
-	vsldoi v0,v0,v0,12
-	li r31,0xc
-	lvsl v1,0,r31
-	vspltisb v2,0
-	vspltisb v3,-1
-	vmrglw v2,v2,v3
-	vsel v0,v1,v0,v2 ; v0: reversal permutation vector
-
-	add r10,r5,r6
-	lvsl v5,0,r5 ; v5: coefficient alignment permutation vector
-	vperm v5,v5,v5,v0 ; v5: reversal coefficient alignment permutation vector
-
-	mr r11,r8
-	lvsl v4,0,r11 ; v4: history alignment permutation vector
-
-	lvx v0,0,r5
-	addi r5,r5,16
-	lvx v1,0,r5
-	vperm v0,v0,v1,v5
-	lvx v2,0,r11
-	addi r11,r11,-16
-	lvx v3,0,r11
-	vperm v2,v3,v2,v4
-	cmplw cr0,r5,r10
-	bc 12,0,L2101
-	vand v0,v0,v6
-	addis r31,0,hi16(L2301)
-	ori r31,r31,lo16(L2301)
-	b L2199
-
-L2101:
-	addi r5,r5,16
-	lvx v7,0,r5
-	vperm v1,v1,v7,v5
-	addi r11,r11,-16
-	lvx v7,0,r11
-	vperm v3,v7,v3,v4
-	vand v1,v1,v6
-	addis r31,0,hi16(L2300)
-	ori r31,r31,lo16(L2300)
-
-L2199:
-	mtctr r31
-
-	; set up invariant vectors
-	vspltish v4,0 ; v4: zero vector
-
-	li r10,-12
-	lvsr v5,r10,r8 ; v5: result shift vector
-	lvsl v6,r10,r3 ; v6: residual shift back vector
-
-	li r10,-4
-	stw r7,-4(r9)
-	lvewx v7,r10,r9 ; v7: lp_quantization vector
-
-L2200:
-	vmulosh v8,v0,v2 ; v8: sum vector
-	bcctr 20,0
-
-L2300:
-	vmulosh v9,v1,v3
-	vsldoi v3,v3,v2,4
-	vaddsws v8,v8,v9
-
-L2301:
-	vsumsws v8,v8,v4 ; v8[3]: sum
-	vsraw v8,v8,v7 ; v8[3]: sum >> lp_quantization
-
-	lvewx v9,0,r3 ; v9[n]: *residual
-	vperm v9,v9,v9,v6 ; v9[3]: *residual
-	vaddsws v8,v9,v8 ; v8[3]: *residual + (sum >> lp_quantization)
-	vsldoi v6,v6,v6,4 ; increment shift vector
-
-	vperm v9,v8,v8,v5 ; v9[n]: shift for storage
-	vsldoi v5,v5,v5,12 ; increment shift vector
-	stvewx v9,0,r8
-
-	vsldoi v8,v8,v8,12
-	vsldoi v2,v2,v8,4 ; insert value onto history
-
-	addi r3,r3,4
-	addi r8,r8,4
-	cmplw cr0,r8,r4 ; i<data_len
-	bc 12,0,L2200
-
-L2400:
-	mtspr 256,r0 ; restore old vrsave
-	lmw r31,-4(r1)
-	blr
diff --git a/libFLAC/ppc/gas/Makefile.am b/libFLAC/ppc/gas/Makefile.am
deleted file mode 100644
index 3a66c27..0000000
--- a/libFLAC/ppc/gas/Makefile.am
+++ /dev/null
@@ -1,52 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-#@@@
-if FLaC__HAS_GAS__TEMPORARILY_DISABLED
-
-SUFFIXES = .s .lo
-
-STRIP_NON_ASM = sh $(top_srcdir)/strip_non_asm_libtool_args.sh
-
-# For some unknown reason libtool can't figure out the tag for 'gas', so
-# we fake it with --tag=CC and strip out unwanted options.
-.s.lo:
-	$(LIBTOOL) --tag=CC --mode=compile $(STRIP_NON_ASM) gas -force_cpusubtype_ALL -o $@ $<
-
-noinst_LTLIBRARIES = libFLAC-asm.la
-libFLAC_asm_la_SOURCES = \
-	lpc_asm.s
-
-else
-
-EXTRA_DIST = \
-	lpc_asm.s
-
-endif
diff --git a/libFLAC/ppc/gas/Makefile.in b/libFLAC/ppc/gas/Makefile.in
deleted file mode 100644
index f4c97bc..0000000
--- a/libFLAC/ppc/gas/Makefile.in
+++ /dev/null
@@ -1,503 +0,0 @@
-# Makefile.in generated by automake 1.7.9 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../../..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_triplet = @host@
-ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-AR = @AR@
-AS = @AS@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCAS = @CCAS@
-CCASFLAGS = @CCASFLAGS@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CXX = @CXX@
-CXXCPP = @CXXCPP@
-CXXDEPMODE = @CXXDEPMODE@
-CXXFLAGS = @CXXFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEBUG_FALSE = @DEBUG_FALSE@
-DEBUG_TRUE = @DEBUG_TRUE@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-DOCBOOK_TO_MAN = @DOCBOOK_TO_MAN@
-DOXYGEN = @DOXYGEN@
-ECHO = @ECHO@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-F77 = @F77@
-FFLAGS = @FFLAGS@
-FLAC__TEST_LEVEL = @FLAC__TEST_LEVEL@
-FLAC__TEST_WITH_VALGRIND = @FLAC__TEST_WITH_VALGRIND@
-FLaC__CPU_IA32_FALSE = @FLaC__CPU_IA32_FALSE@
-FLaC__CPU_IA32_TRUE = @FLaC__CPU_IA32_TRUE@
-FLaC__CPU_PPC_FALSE = @FLaC__CPU_PPC_FALSE@
-FLaC__CPU_PPC_TRUE = @FLaC__CPU_PPC_TRUE@
-FLaC__CPU_SPARC_FALSE = @FLaC__CPU_SPARC_FALSE@
-FLaC__CPU_SPARC_TRUE = @FLaC__CPU_SPARC_TRUE@
-FLaC__HAS_AS_FALSE = @FLaC__HAS_AS_FALSE@
-FLaC__HAS_AS_TRUE = @FLaC__HAS_AS_TRUE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_AS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_DOCBOOK_TO_MAN_FALSE = @FLaC__HAS_DOCBOOK_TO_MAN_FALSE@
-FLaC__HAS_DOCBOOK_TO_MAN_TRUE = @FLaC__HAS_DOCBOOK_TO_MAN_TRUE@
-FLaC__HAS_DOXYGEN_FALSE = @FLaC__HAS_DOXYGEN_FALSE@
-FLaC__HAS_DOXYGEN_TRUE = @FLaC__HAS_DOXYGEN_TRUE@
-FLaC__HAS_GAS_FALSE = @FLaC__HAS_GAS_FALSE@
-FLaC__HAS_GAS_TRUE = @FLaC__HAS_GAS_TRUE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@
-FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE = @FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@
-FLaC__HAS_NASM_FALSE = @FLaC__HAS_NASM_FALSE@
-FLaC__HAS_NASM_TRUE = @FLaC__HAS_NASM_TRUE@
-FLaC__HAS_OGG_FALSE = @FLaC__HAS_OGG_FALSE@
-FLaC__HAS_OGG_TRUE = @FLaC__HAS_OGG_TRUE@
-FLaC__HAS_XMMS_FALSE = @FLaC__HAS_XMMS_FALSE@
-FLaC__HAS_XMMS_TRUE = @FLaC__HAS_XMMS_TRUE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_FALSE@
-FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE = @FLaC__INSTALL_XMMS_PLUGIN_LOCALLY_TRUE@
-FLaC__NO_ASM_FALSE = @FLaC__NO_ASM_FALSE@
-FLaC__NO_ASM_TRUE = @FLaC__NO_ASM_TRUE@
-FLaC__SSE_OS_FALSE = @FLaC__SSE_OS_FALSE@
-FLaC__SSE_OS_TRUE = @FLaC__SSE_OS_TRUE@
-FLaC__SYS_DARWIN_FALSE = @FLaC__SYS_DARWIN_FALSE@
-FLaC__SYS_DARWIN_TRUE = @FLaC__SYS_DARWIN_TRUE@
-FLaC__SYS_LINUX_FALSE = @FLaC__SYS_LINUX_FALSE@
-FLaC__SYS_LINUX_TRUE = @FLaC__SYS_LINUX_TRUE@
-FLaC__USE_3DNOW_FALSE = @FLaC__USE_3DNOW_FALSE@
-FLaC__USE_3DNOW_TRUE = @FLaC__USE_3DNOW_TRUE@
-FLaC__USE_ALTIVEC_FALSE = @FLaC__USE_ALTIVEC_FALSE@
-FLaC__USE_ALTIVEC_TRUE = @FLaC__USE_ALTIVEC_TRUE@
-FLaC__WITH_CPPLIBS_FALSE = @FLaC__WITH_CPPLIBS_FALSE@
-FLaC__WITH_CPPLIBS_TRUE = @FLaC__WITH_CPPLIBS_TRUE@
-GAS = @GAS@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBICONV = @LIBICONV@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-LTLIBICONV = @LTLIBICONV@
-LTLIBOBJS = @LTLIBOBJS@
-MAINT = @MAINT@
-MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
-MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@
-MAKEINFO = @MAKEINFO@
-MINGW_WINSOCK_LIBS = @MINGW_WINSOCK_LIBS@
-NASM = @NASM@
-OBJEXT = @OBJEXT@
-OBJ_FORMAT = @OBJ_FORMAT@
-OGG_CFLAGS = @OGG_CFLAGS@
-OGG_LIBS = @OGG_LIBS@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XMMS_CFLAGS = @XMMS_CFLAGS@
-XMMS_CONFIG = @XMMS_CONFIG@
-XMMS_DATA_DIR = @XMMS_DATA_DIR@
-XMMS_EFFECT_PLUGIN_DIR = @XMMS_EFFECT_PLUGIN_DIR@
-XMMS_GENERAL_PLUGIN_DIR = @XMMS_GENERAL_PLUGIN_DIR@
-XMMS_INPUT_PLUGIN_DIR = @XMMS_INPUT_PLUGIN_DIR@
-XMMS_LIBS = @XMMS_LIBS@
-XMMS_OUTPUT_PLUGIN_DIR = @XMMS_OUTPUT_PLUGIN_DIR@
-XMMS_PLUGIN_DIR = @XMMS_PLUGIN_DIR@
-XMMS_VERSION = @XMMS_VERSION@
-XMMS_VISUALIZATION_PLUGIN_DIR = @XMMS_VISUALIZATION_PLUGIN_DIR@
-ac_ct_AR = @ac_ct_AR@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_CXX = @ac_ct_CXX@
-ac_ct_F77 = @ac_ct_F77@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
-am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-
-
-#@@@
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@SUFFIXES = .s .lo
-
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@STRIP_NON_ASM = sh $(top_srcdir)/strip_non_asm_libtool_args.sh
-
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@noinst_LTLIBRARIES = libFLAC-asm.la
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@libFLAC_asm_la_SOURCES = \
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@	lpc_asm.s
-
-
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@EXTRA_DIST = \
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@	lpc_asm.s
-
-subdir = src/libFLAC/ppc/gas
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-LTLIBRARIES = $(noinst_LTLIBRARIES)
-
-libFLAC_asm_la_LDFLAGS =
-libFLAC_asm_la_LIBADD =
-am__libFLAC_asm_la_SOURCES_DIST = lpc_asm.s
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@am_libFLAC_asm_la_OBJECTS = \
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@	lpc_asm.lo
-libFLAC_asm_la_OBJECTS = $(am_libFLAC_asm_la_OBJECTS)
-
-DEFAULT_INCLUDES =  -I. -I$(srcdir) -I$(top_builddir)
-CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)
-LTCCASCOMPILE = $(LIBTOOL) --mode=compile $(CCAS) $(AM_CCASFLAGS) \
-	$(CCASFLAGS)
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \
-	$(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(am__libFLAC_asm_la_SOURCES_DIST)
-DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
-SOURCES = $(libFLAC_asm_la_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .lo .o .obj .s
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am  $(top_srcdir)/configure.in $(ACLOCAL_M4)
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/libFLAC/ppc/gas/Makefile
-Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in  $(top_builddir)/config.status
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-clean-noinstLTLIBRARIES:
-	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
-	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
-	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
-	  test "$$dir" = "$$p" && dir=.; \
-	  echo "rm -f \"$${dir}/so_locations\""; \
-	  rm -f "$${dir}/so_locations"; \
-	done
-libFLAC-asm.la: $(libFLAC_asm_la_OBJECTS) $(libFLAC_asm_la_DEPENDENCIES) 
-	$(LINK)  $(libFLAC_asm_la_LDFLAGS) $(libFLAC_asm_la_OBJECTS) $(libFLAC_asm_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
-	-rm -f *.tab.c
-
-.s.o:
-	$(CCASCOMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.s.obj:
-	$(CCASCOMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_FALSE@.s.lo:
-	$(LTCCASCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-
-mostlyclean-libtool:
-	-rm -f *.lo
-
-clean-libtool:
-	-rm -rf .libs _libs
-
-distclean-libtool:
-	-rm -f libtool
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-
-TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(ETAGS_ARGS)$$tags$$unique" \
-	  || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	     $$tags $$unique
-
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ../../../..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkinstalldirs) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES)
-
-installdirs:
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
-	mostlyclean-am
-
-distclean: distclean-am
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstLTLIBRARIES ctags distclean \
-	distclean-compile distclean-generic distclean-libtool \
-	distclean-tags distdir dvi dvi-am info info-am install \
-	install-am install-data install-data-am install-exec \
-	install-exec-am install-info install-info-am install-man \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool pdf \
-	pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am
-
-
-# For some unknown reason libtool can't figure out the tag for 'gas', so
-# we fake it with --tag=CC and strip out unwanted options.
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@.s.lo:
-@FLaC__HAS_GAS__TEMPORARILY_DISABLED_TRUE@	$(LIBTOOL) --tag=CC --mode=compile $(STRIP_NON_ASM) gas -force_cpusubtype_ALL -o $@ $<
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libFLAC/ppc/gas/lpc_asm.s b/libFLAC/ppc/gas/lpc_asm.s
deleted file mode 100644
index 2203570..0000000
--- a/libFLAC/ppc/gas/lpc_asm.s
+++ /dev/null
@@ -1,431 +0,0 @@
-#  libFLAC - Free Lossless Audio Codec library
-#  Copyright (C) 2004,2005,2006,2007  Josh Coalson
-#
-#  Redistribution and use 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 the Xiph.org Foundation nor the names of its
-#  contributors may be used to endorse or promote products derived from
-#  this software without specific prior written permission.
-#
-#  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 FOUNDATION 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.
-
-.text
-	.align 2
-.globl _FLAC__lpc_restore_signal_asm_ppc_altivec_16
-.type _FLAC__lpc_restore_signal_asm_ppc_altivec_16, @function
-
-.globl _FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8
-.type _FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8, @function
-
-_FLAC__lpc_restore_signal_asm_ppc_altivec_16:
-#	r3: residual[]
-#	r4: data_len
-#	r5: qlp_coeff[]
-#	r6: order
-#	r7: lp_quantization
-#	r8: data[]
-
-# see src/libFLAC/lpc.c:FLAC__lpc_restore_signal()
-# these is a PowerPC/Altivec assembly version which requires bps<=16 (or actual
-# bps<=15 for mid-side coding, since that uses an extra bit)
-
-# these should be fast; the inner loop is unrolled (it takes no more than
-# 3*(order%4) instructions, all of which are arithmetic), and all of the
-# coefficients and all relevant history stay in registers, so the outer loop
-# has only one load from memory (the residual)
-
-# I have not yet run this through simg4, so there may be some avoidable stalls,
-# and there may be a somewhat more clever way to do the outer loop
-
-# the branch mechanism may prevent dynamic loading; I still need to examine
-# this issue, and there may be a more elegant method
-
-	stmw r31,-4(r1)
-
-	addi r9,r1,-28
-	li r31,0xf
-	andc r9,r9,r31 # for quadword-aligned stack data
-
-	slwi r6,r6,2 # adjust for word size
-	slwi r4,r4,2
-	add r4,r4,r8 # r4 = data+data_len
-
-	mfspr r0,256 # cache old vrsave
-	addis r31,0,0xffff
-	ori r31,r31,0xfc00
-	mtspr 256,r31 # declare VRs in vrsave
-
-	cmplw cr0,r8,r4 # i<data_len
-	bc 4,0,L1400
-
-	# load coefficients into v0-v7 and initial history into v8-v15
-	li r31,0xf
-	and r31,r8,r31 # r31: data%4
-	li r11,16
-	subf r31,r31,r11 # r31: 4-(data%4)
-	slwi r31,r31,3 # convert to bits for vsro
-	li r10,-4
-	stw r31,-4(r9)
-	lvewx v0,r10,r9
-	vspltisb v18,-1
-	vsro v18,v18,v0 # v18: mask vector
-
-	li r31,0x8
-	lvsl v0,0,r31
-	vsldoi v0,v0,v0,12
-	li r31,0xc
-	lvsl v1,0,r31
-	vspltisb v2,0
-	vspltisb v3,-1
-	vmrglw v2,v2,v3
-	vsel v0,v1,v0,v2 # v0: reversal permutation vector
-
-	add r10,r5,r6
-	lvsl v17,0,r5 # v17: coefficient alignment permutation vector
-	vperm v17,v17,v17,v0 # v17: reversal coefficient alignment permutation vector
-
-	mr r11,r8
-	lvsl v16,0,r11 # v16: history alignment permutation vector
-
-	lvx v0,0,r5
-	addi r5,r5,16
-	lvx v1,0,r5
-	vperm v0,v0,v1,v17
-	lvx v8,0,r11
-	addi r11,r11,-16
-	lvx v9,0,r11
-	vperm v8,v9,v8,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1101
-	vand v0,v0,v18
-	addis r31,0,L1307@ha
-	ori r31,r31,L1307@l
-	b L1199
-
-L1101:
-	addi r5,r5,16
-	lvx v2,0,r5
-	vperm v1,v1,v2,v17
-	addi r11,r11,-16
-	lvx v10,0,r11
-	vperm v9,v10,v9,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1102
-	vand v1,v1,v18
-	addis r31,0,L1306@ha
-	ori r31,r31,L1306@l
-	b L1199
-
-L1102:
-	addi r5,r5,16
-	lvx v3,0,r5
-	vperm v2,v2,v3,v17
-	addi r11,r11,-16
-	lvx v11,0,r11
-	vperm v10,v11,v10,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1103
-	vand v2,v2,v18
-	lis r31,L1305@ha
-	la r31,L1305@l(r31)
-	b L1199
-
-L1103:
-	addi r5,r5,16
-	lvx v4,0,r5
-	vperm v3,v3,v4,v17
-	addi r11,r11,-16
-	lvx v12,0,r11
-	vperm v11,v12,v11,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1104
-	vand v3,v3,v18
-	lis r31,L1304@ha
-	la r31,L1304@l(r31)
-	b L1199
-
-L1104:
-	addi r5,r5,16
-	lvx v5,0,r5
-	vperm v4,v4,v5,v17
-	addi r11,r11,-16
-	lvx v13,0,r11
-	vperm v12,v13,v12,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1105
-	vand v4,v4,v18
-	lis r31,L1303@ha
-	la r31,L1303@l(r31)
-	b L1199
-
-L1105:
-	addi r5,r5,16
-	lvx v6,0,r5
-	vperm v5,v5,v6,v17
-	addi r11,r11,-16
-	lvx v14,0,r11
-	vperm v13,v14,v13,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1106
-	vand v5,v5,v18
-	lis r31,L1302@ha
-	la r31,L1302@l(r31)
-	b L1199
-
-L1106:
-	addi r5,r5,16
-	lvx v7,0,r5
-	vperm v6,v6,v7,v17
-	addi r11,r11,-16
-	lvx v15,0,r11
-	vperm v14,v15,v14,v16
-	cmplw cr0,r5,r10
-	bc 12,0,L1107
-	vand v6,v6,v18
-	lis r31,L1301@ha
-	la r31,L1301@l(r31)
-	b L1199
-
-L1107:
-	addi r5,r5,16
-	lvx v19,0,r5
-	vperm v7,v7,v19,v17
-	addi r11,r11,-16
-	lvx v19,0,r11
-	vperm v15,v19,v15,v16
-	vand v7,v7,v18
-	lis r31,L1300@ha
-	la r31,L1300@l(r31)
-
-L1199:
-	mtctr r31
-
-	# set up invariant vectors
-	vspltish v16,0 # v16: zero vector
-
-	li r10,-12
-	lvsr v17,r10,r8 # v17: result shift vector
-	lvsl v18,r10,r3 # v18: residual shift back vector
-
-	li r10,-4
-	stw r7,-4(r9)
-	lvewx v19,r10,r9 # v19: lp_quantization vector
-
-L1200:
-	vmulosh v20,v0,v8 # v20: sum vector
-	bcctr 20,0
-
-L1300:
-	vmulosh v21,v7,v15
-	vsldoi v15,v15,v14,4 # increment history
-	vaddsws v20,v20,v21
-
-L1301:
-	vmulosh v21,v6,v14
-	vsldoi v14,v14,v13,4
-	vaddsws v20,v20,v21
-
-L1302:
-	vmulosh v21,v5,v13
-	vsldoi v13,v13,v12,4
-	vaddsws v20,v20,v21
-
-L1303:
-	vmulosh v21,v4,v12
-	vsldoi v12,v12,v11,4
-	vaddsws v20,v20,v21
-
-L1304:
-	vmulosh v21,v3,v11
-	vsldoi v11,v11,v10,4
-	vaddsws v20,v20,v21
-
-L1305:
-	vmulosh v21,v2,v10
-	vsldoi v10,v10,v9,4
-	vaddsws v20,v20,v21
-
-L1306:
-	vmulosh v21,v1,v9
-	vsldoi v9,v9,v8,4
-	vaddsws v20,v20,v21
-
-L1307:
-	vsumsws v20,v20,v16 # v20[3]: sum
-	vsraw v20,v20,v19 # v20[3]: sum >> lp_quantization
-
-	lvewx v21,0,r3 # v21[n]: *residual
-	vperm v21,v21,v21,v18 # v21[3]: *residual
-	vaddsws v20,v21,v20 # v20[3]: *residual + (sum >> lp_quantization)
-	vsldoi v18,v18,v18,4 # increment shift vector
-
-	vperm v21,v20,v20,v17 # v21[n]: shift for storage
-	vsldoi v17,v17,v17,12 # increment shift vector
-	stvewx v21,0,r8
-
-	vsldoi v20,v20,v20,12
-	vsldoi v8,v8,v20,4 # insert value onto history
-
-	addi r3,r3,4
-	addi r8,r8,4
-	cmplw cr0,r8,r4 # i<data_len
-	bc 12,0,L1200
-
-L1400:
-	mtspr 256,r0 # restore old vrsave
-	lmw r31,-4(r1)
-	blr
-
-_FLAC__lpc_restore_signal_asm_ppc_altivec_16_order8:
-#	r3: residual[]
-#	r4: data_len
-#	r5: qlp_coeff[]
-#	r6: order
-#	r7: lp_quantization
-#	r8: data[]
-
-# see _FLAC__lpc_restore_signal_asm_ppc_altivec_16() above
-# this version assumes order<=8; it uses fewer vector registers, which should
-# save time in context switches, and has less code, which may improve
-# instruction caching
-
-	stmw r31,-4(r1)
-
-	addi r9,r1,-28
-	li r31,0xf
-	andc r9,r9,r31 # for quadword-aligned stack data
-
-	slwi r6,r6,2 # adjust for word size
-	slwi r4,r4,2
-	add r4,r4,r8 # r4 = data+data_len
-
-	mfspr r0,256 # cache old vrsave
-	addis r31,0,0xffc0
-	ori r31,r31,0x0000
-	mtspr 256,r31 # declare VRs in vrsave
-
-	cmplw cr0,r8,r4 # i<data_len
-	bc 4,0,L2400
-
-	# load coefficients into v0-v1 and initial history into v2-v3
-	li r31,0xf
-	and r31,r8,r31 # r31: data%4
-	li r11,16
-	subf r31,r31,r11 # r31: 4-(data%4)
-	slwi r31,r31,3 # convert to bits for vsro
-	li r10,-4
-	stw r31,-4(r9)
-	lvewx v0,r10,r9
-	vspltisb v6,-1
-	vsro v6,v6,v0 # v6: mask vector
-
-	li r31,0x8
-	lvsl v0,0,r31
-	vsldoi v0,v0,v0,12
-	li r31,0xc
-	lvsl v1,0,r31
-	vspltisb v2,0
-	vspltisb v3,-1
-	vmrglw v2,v2,v3
-	vsel v0,v1,v0,v2 # v0: reversal permutation vector
-
-	add r10,r5,r6
-	lvsl v5,0,r5 # v5: coefficient alignment permutation vector
-	vperm v5,v5,v5,v0 # v5: reversal coefficient alignment permutation vector
-
-	mr r11,r8
-	lvsl v4,0,r11 # v4: history alignment permutation vector
-
-	lvx v0,0,r5
-	addi r5,r5,16
-	lvx v1,0,r5
-	vperm v0,v0,v1,v5
-	lvx v2,0,r11
-	addi r11,r11,-16
-	lvx v3,0,r11
-	vperm v2,v3,v2,v4
-	cmplw cr0,r5,r10
-	bc 12,0,L2101
-	vand v0,v0,v6
-	lis r31,L2301@ha
-	la r31,L2301@l(r31)
-	b L2199
-
-L2101:
-	addi r5,r5,16
-	lvx v7,0,r5
-	vperm v1,v1,v7,v5
-	addi r11,r11,-16
-	lvx v7,0,r11
-	vperm v3,v7,v3,v4
-	vand v1,v1,v6
-	lis r31,L2300@ha
-	la r31,L2300@l(r31)
-
-L2199:
-	mtctr r31
-
-	# set up invariant vectors
-	vspltish v4,0 # v4: zero vector
-
-	li r10,-12
-	lvsr v5,r10,r8 # v5: result shift vector
-	lvsl v6,r10,r3 # v6: residual shift back vector
-
-	li r10,-4
-	stw r7,-4(r9)
-	lvewx v7,r10,r9 # v7: lp_quantization vector
-
-L2200:
-	vmulosh v8,v0,v2 # v8: sum vector
-	bcctr 20,0
-
-L2300:
-	vmulosh v9,v1,v3
-	vsldoi v3,v3,v2,4
-	vaddsws v8,v8,v9
-
-L2301:
-	vsumsws v8,v8,v4 # v8[3]: sum
-	vsraw v8,v8,v7 # v8[3]: sum >> lp_quantization
-
-	lvewx v9,0,r3 # v9[n]: *residual
-	vperm v9,v9,v9,v6 # v9[3]: *residual
-	vaddsws v8,v9,v8 # v8[3]: *residual + (sum >> lp_quantization)
-	vsldoi v6,v6,v6,4 # increment shift vector
-
-	vperm v9,v8,v8,v5 # v9[n]: shift for storage
-	vsldoi v5,v5,v5,12 # increment shift vector
-	stvewx v9,0,r8
-
-	vsldoi v8,v8,v8,12
-	vsldoi v2,v2,v8,4 # insert value onto history
-
-	addi r3,r3,4
-	addi r8,r8,4
-	cmplw cr0,r8,r4 # i<data_len
-	bc 12,0,L2200
-
-L2400:
-	mtspr 256,r0 # restore old vrsave
-	lmw r31,-4(r1)
-	blr
diff --git a/libFLAC/stream_decoder.c b/libFLAC/stream_decoder.c
index 7dff737..27bac3e 100644
--- a/libFLAC/stream_decoder.c
+++ b/libFLAC/stream_decoder.c
@@ -936,6 +936,9 @@
 	FLAC__ASSERT(0 != decoder->private_);
 	FLAC__ASSERT(0 != decoder->protected_);
 
+	if(!decoder->private_->internal_reset_hack && decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED)
+		return false;
+
 	decoder->private_->samples_decoded = 0;
 	decoder->private_->do_md5_checking = false;
 
@@ -1281,9 +1284,6 @@
 	unsigned i;
 	FLAC__int32 *tmp;
 
-	/* Make sure size is some sensible minimum value. Plumb through predictor_order maybe? */
-	size = size < FLAC__MAX_LPC_ORDER ? FLAC__MAX_LPC_ORDER : size ;
-
 	if(size <= decoder->private_->output_capacity && channels <= decoder->private_->output_channels)
 		return true;
 
@@ -1738,6 +1738,7 @@
 		}
 		if (obj->num_comments > 0) {
 			if (0 == (obj->comments = safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) {
+				obj->num_comments = 0;
 				decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
 				obj->num_comments = 0;
 				return false;
@@ -1754,8 +1755,10 @@
 				}
 				else
 					length -= 4;
-				if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length))
+				if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) {
+					obj->num_comments = i;
 					return false; /* read_callback_ sets the state for us */
+				}
 				if (obj->comments[i].length > 0) {
 					if (length < obj->comments[i].length) {
 						obj->num_comments = i;
@@ -1778,13 +1781,15 @@
 					obj->comments[i].entry = 0;
 			}
 		}
-		else
-			obj->comments = 0;
 	}
 
   skip:
 	if (length > 0) {
-		/* This will only happen on files with invalid data in comments */
+		/* length > 0 can only happen on files with invalid data in comments */
+		if(obj->num_comments < 1) {
+			free(obj->comments);
+			obj->comments = NULL;
+		}
 		if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length))
 			return false; /* read_callback_ sets the state for us */
 	}
@@ -2111,7 +2116,7 @@
 #if 1
 						mid = decoder->private_->output[0][i];
 						side = decoder->private_->output[1][i];
-						mid <<= 1;
+						mid = ((uint32_t) mid) << 1;
 						mid |= (side & 1); /* i.e. if 'side' is odd... */
 						decoder->private_->output[0][i] = (mid + side) >> 1;
 						decoder->private_->output[1][i] = (mid - side) >> 1;
@@ -2537,8 +2542,10 @@
 
 	if(wasted_bits && do_full_decode) {
 		x = decoder->private_->frame.subframes[channel].wasted_bits;
-		for(i = 0; i < decoder->private_->frame.header.blocksize; i++)
-			decoder->private_->output[channel][i] <<= x;
+		for(i = 0; i < decoder->private_->frame.header.blocksize; i++) {
+			uint32_t val = decoder->private_->output[channel][i];
+			decoder->private_->output[channel][i] = (val << x);
+		}
 	}
 
 	return true;
@@ -2595,6 +2602,11 @@
 		case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2:
 			if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN))
 				return false; /* read_callback_ sets the state for us */
+			if(decoder->private_->frame.header.blocksize >> u32 < order) {
+				send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
+				decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
+				return true;
+			}
 			subframe->entropy_coding_method.data.partitioned_rice.order = u32;
 			subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel];
 			break;
@@ -2656,6 +2668,11 @@
 	/* read qlp shift */
 	if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN))
 		return false; /* read_callback_ sets the state for us */
+	if(i32 < 0) {
+		send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
+		decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
+		return true;
+	}
 	subframe->quantization_level = i32;
 
 	/* read quantized lp coefficiencts */
@@ -2674,6 +2691,11 @@
 		case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2:
 			if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN))
 				return false; /* read_callback_ sets the state for us */
+			if(decoder->private_->frame.header.blocksize >> u32 < order) {
+				send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
+				decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
+				return true;
+			}
 			subframe->entropy_coding_method.data.partitioned_rice.order = u32;
 			subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel];
 			break;
@@ -2697,9 +2719,6 @@
 	/* decode the subframe */
 	if(do_full_decode) {
 		memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order);
-		/*@@@@@@ technically not pessimistic enough, should be more like
-		if( (FLAC__uint64)order * ((((FLAC__uint64)1)<<bps)-1) * ((1<<subframe->qlp_coeff_precision)-1) < (((FLAC__uint64)-1) << 32) )
-		*/
 		if(bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32)
 			if(bps <= 16 && subframe->qlp_coeff_precision <= 16)
 				decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order);
@@ -2745,21 +2764,8 @@
 	const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN;
 	const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER;
 
-	/* sanity checks */
-	if(partition_order == 0) {
-		if(decoder->private_->frame.header.blocksize < predictor_order) {
-			send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
-			decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
-			return true;
-		}
-	}
-	else {
-		if(partition_samples < predictor_order) {
-			send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC);
-			decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC;
-			return true;
-		}
-	}
+	/* invalid predictor and partition orders mush be handled in the callers */
+	FLAC__ASSERT(partition_order > 0? partition_samples >= predictor_order : decoder->private_->frame.header.blocksize >= predictor_order);
 
 	if(!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order))) {
 		decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
diff --git a/libFLAC/stream_encoder.c b/libFLAC/stream_encoder.c
index 3aa90fb..6380ce6 100644
--- a/libFLAC/stream_encoder.c
+++ b/libFLAC/stream_encoder.c
@@ -2159,14 +2159,21 @@
 	FLAC__ASSERT(0 != encoder->protected_);
 	FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK);
 
+//	FLAC__ASSERT(samples <= blocksize);
+
 	do {
 		const unsigned n = flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j);
 
 		if(encoder->protected_->verify)
 			append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, n);
 
-		for(channel = 0; channel < channels; channel++)
+		for(channel = 0; channel < channels; channel++) {
+			if (buffer[channel] == NULL) {
+				encoder->protected_->state = FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
+				return false;
+			}
 			memcpy(&encoder->private_->integer_signal[channel][encoder->private_->current_sample_number], &buffer[channel][j], sizeof(buffer[channel][0]) * n);
+		}
 
 		if(encoder->protected_->do_mid_side_stereo) {
 			FLAC__ASSERT(channels == 2);
