From 745e491e8dfb1f524de18958249642baff061cae Mon Sep 17 00:00:00 2001
From: llea <llea>
Date: Thu, 10 Feb 2005 17:16:14 +0000
Subject: [PATCH] Add gsm audio codec support. Add notification incoming call.

---
 CHANGES                      |  14 +-
 Makefile                     |   2 +
 gsm/COPYRIGHT                |  16 +
 gsm/ChangeLog                |  80 +++
 gsm/INSTALL                  |  99 ++++
 gsm/MACHINES                 |  11 +
 gsm/MANIFEST                 |  59 +++
 gsm/Makefile                 |  36 ++
 gsm/README                   |  37 ++
 gsm/add.c                    | 235 +++++++++
 gsm/code.c                   | 101 ++++
 gsm/config.h                 |  37 ++
 gsm/debug.c                  |  76 +++
 gsm/decode.c                 |  63 +++
 gsm/gsm.h                    |  71 +++
 gsm/gsm_create.c             |  45 ++
 gsm/gsm_decode.c             | 361 +++++++++++++
 gsm/gsm_destroy.c            |  26 +
 gsm/gsm_encode.c             | 451 +++++++++++++++++
 gsm/gsm_explode.c            | 417 +++++++++++++++
 gsm/gsm_implode.c            | 515 +++++++++++++++++++
 gsm/gsm_option.c             |  69 +++
 gsm/gsm_print.c              | 167 ++++++
 gsm/long_term.c              | 949 +++++++++++++++++++++++++++++++++++
 gsm/lpc.c                    | 341 +++++++++++++
 gsm/preprocess.c             | 113 +++++
 gsm/private.h                | 268 ++++++++++
 gsm/proto.h                  |  65 +++
 gsm/rpe.c                    | 488 ++++++++++++++++++
 gsm/short_term.c             | 429 ++++++++++++++++
 gsm/table.c                  |  63 +++
 gsm/toast.c                  | 800 +++++++++++++++++++++++++++++
 gsm/toast.h                  | 109 ++++
 gsm/toast_alaw.c             | 334 ++++++++++++
 gsm/toast_audio.c            | 113 +++++
 gsm/toast_lin.c              |  24 +
 gsm/toast_ulaw.c             | 621 +++++++++++++++++++++++
 gsm/unproto.h                |  23 +
 src/Makefile                 |  17 +-
 src/audiocodec.cpp           |  82 +--
 src/audiocodec.h             |   4 +
 src/audiortp.cpp             |  23 +-
 src/audiortp.h               |   2 +-
 src/configurationpanel.ui    |  27 +-
 src/configurationpanelui.cpp | 599 +++++++++++-----------
 src/configurationpanelui.h   |   2 +-
 src/manager.cpp              |  18 +-
 src/manager.h                |   1 +
 src/phonebookui.cpp          |   2 +-
 src/phonebookui.h            |   2 +-
 src/sip.cpp                  |  10 +-
 src/tonegenerator.cpp        |  29 +-
 src/tonegenerator.h          |  13 +-
 src/url_inputui.cpp          |   2 +-
 src/url_inputui.h            |   2 +-
 55 files changed, 8190 insertions(+), 373 deletions(-)
 create mode 100644 gsm/COPYRIGHT
 create mode 100644 gsm/ChangeLog
 create mode 100644 gsm/INSTALL
 create mode 100644 gsm/MACHINES
 create mode 100644 gsm/MANIFEST
 create mode 100644 gsm/Makefile
 create mode 100644 gsm/README
 create mode 100644 gsm/add.c
 create mode 100644 gsm/code.c
 create mode 100644 gsm/config.h
 create mode 100644 gsm/debug.c
 create mode 100644 gsm/decode.c
 create mode 100644 gsm/gsm.h
 create mode 100644 gsm/gsm_create.c
 create mode 100644 gsm/gsm_decode.c
 create mode 100644 gsm/gsm_destroy.c
 create mode 100644 gsm/gsm_encode.c
 create mode 100644 gsm/gsm_explode.c
 create mode 100644 gsm/gsm_implode.c
 create mode 100644 gsm/gsm_option.c
 create mode 100644 gsm/gsm_print.c
 create mode 100644 gsm/long_term.c
 create mode 100644 gsm/lpc.c
 create mode 100644 gsm/preprocess.c
 create mode 100644 gsm/private.h
 create mode 100644 gsm/proto.h
 create mode 100644 gsm/rpe.c
 create mode 100644 gsm/short_term.c
 create mode 100644 gsm/table.c
 create mode 100644 gsm/toast.c
 create mode 100644 gsm/toast.h
 create mode 100644 gsm/toast_alaw.c
 create mode 100644 gsm/toast_audio.c
 create mode 100644 gsm/toast_lin.c
 create mode 100644 gsm/toast_ulaw.c
 create mode 100644 gsm/unproto.h

diff --git a/CHANGES b/CHANGES
index 48a68870aa..ca20a29e07 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,4 +1,14 @@
-SFLPhone (0.2) / 2005-01-18
+SFLphone (0.3) / 2005-02-10
+	* ALSA driver support added (not yet operationnal)
+	* GSM audio codec support added
+	* Rings support (just ulaw format) added
+	* Notification incoming call added
+	* Apply skin feature added
+	* Volume control added
+	* Registration manually added
+	* Config-file in home directory changed to ".sflphone"
+
+SFLphone (0.2) / 2005-01-18
 	* Lines management updated
 	* Blocking bug fixed
 	* Configuration tree, made from a config file, added for setup
@@ -7,5 +17,5 @@ SFLPhone (0.2) / 2005-01-18
 	* Apply feature updated
 	* Non-network or request failure cases updated
 
-SFLPhone (0.1a) / 2004-12-22
+SFLphone (0.1a) / 2004-12-22
 	* First release
diff --git a/Makefile b/Makefile
index 181081847c..a035b8fb96 100644
--- a/Makefile
+++ b/Makefile
@@ -4,6 +4,7 @@
 # Author: Laurielle Lea (laurielle.lea@savoirfairelinux.com)
 #
 all:
+	cd gsm ; make
 	cd src; make
 
 install:
@@ -14,4 +15,5 @@ uninstall:
 
 clean:
 	cd src; make clean
+	cd gsm ; make clean
 
diff --git a/gsm/COPYRIGHT b/gsm/COPYRIGHT
new file mode 100644
index 0000000000..eba0e523bb
--- /dev/null
+++ b/gsm/COPYRIGHT
@@ -0,0 +1,16 @@
+Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin
+
+Any use of this software is permitted provided that this notice is not
+removed and that neither the authors nor the Technische Universitaet Berlin
+are deemed to have made any representations as to the suitability of this
+software for any purpose nor are held responsible for any defects of
+this software.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+
+As a matter of courtesy, the authors request to be informed about uses
+this software has found, about bugs in this software, and about any
+improvements that may be of general interest.
+
+Berlin, 28.11.1994
+Jutta Degener
+Carsten Bormann
diff --git a/gsm/ChangeLog b/gsm/ChangeLog
new file mode 100644
index 0000000000..4cf467d091
--- /dev/null
+++ b/gsm/ChangeLog
@@ -0,0 +1,80 @@
+
+Fri Jul  5 19:26:37 1996 	Jutta Degener (jutta@cs.tu-berlin.de)
+
+	* Release 1.0 Patchlevel 10
+	src/toast_alaw.c: exchanged A-law tables for something
+		slightly more A-law.
+
+Tue Jul  2 12:18:20 1996  Jutta Degener (jutta@cs.tu-berlin.de)
+
+	* Release 1.0 Patchlevel 9
+	src/long_term.c: in FLOAT_MUL mode, an array was accessed past its end
+	src/gsm_option.c: three options related to WAV #49 packing
+	src/gsm_encode.c: support WAV #49-style encoding.
+	src/gsm_decode.c: support WAV #49-style decoding.
+	tls/sour.c: generate the WAV bit shifting code, encode
+	tls/ginger.c: generate the WAV bit shifting code, decode
+	The WAV code goes back to an inofficial patch #8 that
+	Jeff Chilton sent us (hence the jump from 7 to 9).
+	src/toast.c: add _fsetmode() calls to set stdin/stdout to
+		binary (from an OS/2 port by Arnd Gronenberg.)
+
+Tue Mar  7 01:55:10 1995  Jutta Degener (jutta@cs.tu-berlin.de)
+
+	* Release 1.0 Patchlevel 7
+	src/long_term.c: Yet another 16-bit overflow
+	src/toast.c: -C option to toast, cuts LPC time
+	src/gsm_option.c: corresponding LPC_CUT option to GSM library
+
+Fri Dec 30 23:33:50 1994  Jutta Degener (jutta@cs.tu-berlin.de)
+
+        * Release 1.0 Patchlevel 6
+        src/lpc.c: fixed 16-bit addition overflow in Autocorrelation code
+        src/add.c: gsm_L_asl should fall back on gsm_L_asr, not gsm_asr
+
+Mon Nov 28 20:49:57 1994  Jutta Degener (jutta@cs.tu-berlin.de)
+	
+	* Release 1.0 Patchlevel 5
+	src/toast_audio.c: initialization should return -1 on error
+	src/gsm_destroy.c: #include configuration header file
+	src/add.c: gsm_sub should cast its parameters to longword
+	man/*: bug reports to {jutta,cabo}@cs.tu-berlin.de, not to toast@tub
+	inc/private.h: longword long by default, not int
+	inc/toast.h: read/write fopen modes "rb" and "wb", not just "r"
+	src/toast.c: better (or different, anyway) error handling in process()
+
+Tue May 10 19:41:34 1994  Jutta Degener (jutta at kugelbus)
+	
+	* Release 1.0 Patchlevel 4
+	inc/private.h: GSM_ADD should cast to ulongword, not to unsigned.
+	src/long_term.c: missing cast to longword.
+	add-test/add_test.c: Test macros too, not only functions,
+	thanks to Simao Ferraz de Campos Neto, simao@dragon.cpqd.ansp.br
+	General cleanup: remove unused variables, add function prototypes.
+
+Tue Jan 25 22:53:40 1994  Jutta Degener (jutta at kugelbus)
+
+	* Release 1.0 Patchlevel 3
+	changed rpe.c's STEP macro to work with 16-bit integers,
+	thanks to Dr Alex Lee (alexlee@solomon.technet.sg);
+	removed non-fatal bugs from add-test.dta, private.h
+	and toast_audio.c, thanks to P. Emanuelsson.
+
+Fri Jan 29 19:02:12 1993  Jutta Degener  (jutta at kraftbus)
+	
+	* Release 1.0 Patchlevel 2
+	fixed L_add(0,-1) in src/add.c and inc/private.h,
+	thanks to Raphael Trommer at AT&T Bell Laboratories;
+	various other ANSI C compatibility details
+
+Fri Oct 30 17:58:54 1992  Jutta Degener  (jutta at kraftbus)
+
+	* Release 1.0 Patchlevel 1
+	Switched uid/gid in toast's [f]chown calls.
+
+Wed Oct 28 14:12:35 1992  Carsten Bormann  (cabo at kubus)
+
+	* Release 1.0: released
+	Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+	Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+	details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
diff --git a/gsm/INSTALL b/gsm/INSTALL
new file mode 100644
index 0000000000..5850304f8b
--- /dev/null
+++ b/gsm/INSTALL
@@ -0,0 +1,99 @@
+How to get started:
+
+   Edit the Makefile.
+
+	You should configure a few machine-dependencies and what
+	compiler you want to use.
+
+  	The code works both with ANSI and K&R-C.  Use
+	-DNeedFunctionPrototypes to compile with, or
+	-UNeedFunctionPrototypes to compile without, function
+	prototypes in the header files.
+ 
+   Make addtst
+
+	The "add" program that will be compiled and run checks whether
+	the basic math functions of the gsm library work with your
+	compiler.  If it prints anything to stderr, complain (to us).
+
+   Edit inc/config.h.
+
+   Make
+
+   	Local versions of the gsm library and the "compress"-like filters
+	toast, untoast and tcat will be generated.
+
+   	If the compilation aborts because of a missing function,
+	declaration, or header file, see if there's something in
+	inc/config.h to work around it.  If not, complain.
+
+   Try it
+
+	Grab an audio file from somewhere (raw u-law or Sun .au is fine, 
+    	linear 16-bit in host byte order will do), copy it, toast it,
+	untoast it, and listen to the result.
+    
+	The GSM-encoded and -decoded audio should have the quality
+	of a good phone line.  If the resulting audio is noisier than
+	your original, or if you hear compression artifacts, complain;
+	that's a bug in our software, not a bug in the GSM encoding
+	standard itself.
+
+Installation
+
+   You can install the gsm library interface, or the toast binaries,
+   or both.
+
+   Edit the Makefile
+	
+	Fill in the directories where you want to install the
+	library, header files, manual pages, and binaries.
+
+	Turn off the installation of one half of the distribution
+	(i.e., gsm library or toast binaries) by not setting the
+	corresponding directory root Makefile macro.
+
+   make install
+
+	will install the programs "toast" with two links named
+	"tcat" and "untoast", and the gsm library "libgsm.a" with
+	a "gsm.h" header file, and their respective manual pages.
+
+
+Optimizing
+
+   This code was developed on a machine without an integer
+   multiplication instruction, where we obtained the fastest result by
+   replacing some of the integer multiplications with floating point
+   multiplications.
+
+   If your machine does multiply integers fast enough,
+   leave USE_FLOAT_MUL undefined.  The results should be the
+   same in both cases.
+
+   On machines with fast floating point arithmetic, defining
+   both USE_FLOAT_MUL and FAST makes a run-time library
+   option available that will (in a few crucial places) use
+   ``native'' floating point operations rather than the bit-by-bit
+   defined ones of the GSM standard.  If you use this fast
+   option, the outcome will not be bitwise identical to the
+   results prescribed by the standard, but it is compatible with
+   the standard encoding, and a user is unlikely to notice a
+   difference.
+
+
+Bug Reports
+
+   Please direct bug reports, questions, and comments to
+   jutta@cs.tu-berlin.de and cabo@informatik.uni-bremen.de.
+
+
+Good luck,
+
+   Jutta Degener,
+   Carsten Bormann
+
+--
+Copyright 1992, 1993, 1994, by Jutta Degener and Carsten Bormann,
+Technische Universitaet Berlin.  See the accompanying file "COPYRIGHT"
+for details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
diff --git a/gsm/MACHINES b/gsm/MACHINES
new file mode 100644
index 0000000000..4adafd24fa
--- /dev/null
+++ b/gsm/MACHINES
@@ -0,0 +1,11 @@
+The gsm library has been tested successfully on the following platforms:
+
+- Various Sun4's running SunOS 4.1.2
+- SPARC1 (SunOS 4.1.1)
+- Integrated Solutions 68k Optimum running 4.3BSD UNIX with a Green Hills cc
+- NeXTstation running NeXT-OS/Mach 3.0
+- No-name AT/386 with Xenix 2.3.2 (using -DSTUPID_COMPILER)
+- RS/6000-350 running AIX 3.2.0
+- RS/6000-320 running AIX 3.1.5
+- Alliant FX80 (Concentrix 5.7)
+- SGI Indigo XS4000 (IRIX 4.0.5F)
diff --git a/gsm/MANIFEST b/gsm/MANIFEST
new file mode 100644
index 0000000000..6db3b2a3e3
--- /dev/null
+++ b/gsm/MANIFEST
@@ -0,0 +1,59 @@
+gsm-1.0/COPYRIGHT
+gsm-1.0/ChangeLog
+gsm-1.0/INSTALL
+gsm-1.0/MACHINES
+gsm-1.0/MANIFEST
+gsm-1.0/Makefile
+gsm-1.0/README
+gsm-1.0/add-test/add_test.c
+gsm-1.0/add-test/add_test.dta
+gsm-1.0/inc/gsm.h
+gsm-1.0/inc/proto.h
+gsm-1.0/inc/unproto.h
+gsm-1.0/inc/config.h
+gsm-1.0/inc/private.h
+gsm-1.0/inc/toast.h
+gsm-1.0/man/bitter.1
+gsm-1.0/man/gsm.3
+gsm-1.0/man/gsm_explode.3
+gsm-1.0/man/gsm_print.3
+gsm-1.0/man/gsm_option.3
+gsm-1.0/man/toast.1
+gsm-1.0/src/add.c
+gsm-1.0/src/code.c
+gsm-1.0/src/debug.c
+gsm-1.0/src/decode.c
+gsm-1.0/src/gsm_destroy.c
+gsm-1.0/src/gsm_decode.c
+gsm-1.0/src/gsm_encode.c
+gsm-1.0/src/gsm_explode.c
+gsm-1.0/src/gsm_implode.c
+gsm-1.0/src/gsm_create.c
+gsm-1.0/src/gsm_print.c
+gsm-1.0/src/gsm_option.c
+gsm-1.0/src/long_term.c
+gsm-1.0/src/lpc.c
+gsm-1.0/src/preprocess.c
+gsm-1.0/src/rpe.c
+gsm-1.0/src/short_term.c
+gsm-1.0/src/table.c
+gsm-1.0/src/toast.c
+gsm-1.0/src/toast_alaw.c
+gsm-1.0/src/toast_audio.c
+gsm-1.0/src/toast_lin.c
+gsm-1.0/src/toast_ulaw.c
+gsm-1.0/tls/bitter.c
+gsm-1.0/tls/bitter.dta
+gsm-1.0/tls/taste.c
+gsm-1.0/tls/taste.h
+gsm-1.0/tls/sweet.c
+gsm-1.0/tls/sour.c
+gsm-1.0/tls/sour1.dta
+gsm-1.0/tls/sour2.dta
+gsm-1.0/tls/ginger.c
+gsm-1.0/tst/cod2lin.c
+gsm-1.0/tst/cod2txt.c
+gsm-1.0/tst/gsm2cod.c
+gsm-1.0/tst/lin2cod.c
+gsm-1.0/tst/lin2txt.c
+gsm-1.0/tst/run
diff --git a/gsm/Makefile b/gsm/Makefile
new file mode 100644
index 0000000000..140b7ed3cc
--- /dev/null
+++ b/gsm/Makefile
@@ -0,0 +1,36 @@
+CC=g++
+
+CFLAGS=-Wall -g -O3 -I. -I.. -DHAVE_CONFIG_H
+
+AR=ar
+
+OBJS = add.o\
+	gsm_create.o\
+	gsm_explode.o\
+	long_term.o\
+	short_term.o\
+	code.o\
+	gsm_decode.o\
+	gsm_implode.o\
+	lpc.o\
+	table.o\
+	debug.o\
+	gsm_destroy.o\
+	gsm_option.o\
+	preprocess.o\
+	decode.o\
+	gsm_encode.o\
+	gsm_print.o\
+	rpe.o
+
+all:	libgsm.a
+
+.c.o: 
+	$(CC) $(CFLAGS) -c -o $@ $<
+
+clean:
+	rm -f *.o *.a *~ *.moc.cpp *.bak
+
+libgsm.a: $(OBJS)
+	$(AR) rcs $@ $(OBJS)
+
diff --git a/gsm/README b/gsm/README
new file mode 100644
index 0000000000..cb6af85cf0
--- /dev/null
+++ b/gsm/README
@@ -0,0 +1,37 @@
+
+GSM 06.10 13 kbit/s RPE/LTP speech compression available
+--------------------------------------------------------
+
+The Communications and Operating Systems Research Group (KBS) at the
+Technische Universitaet Berlin is currently working on a set of
+UNIX-based tools for computer-mediated telecooperation that will be
+made freely available.
+
+As part of this effort we are publishing an implementation of the
+European GSM 06.10 provisional standard for full-rate speech
+transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse
+excitation/long term prediction) coding at 13 kbit/s.
+
+GSM 06.10 compresses frames of 160 13-bit samples (8 kHz sampling
+rate, i.e. a frame rate of 50 Hz) into 260 bits; for compatibility
+with typical UNIX applications, our implementation turns frames of 160
+16-bit linear samples into 33-byte frames (1650 Bytes/s).
+The quality of the algorithm is good enough for reliable speaker
+recognition; even music often survives transcoding in recognizable 
+form (given the bandwidth limitations of 8 kHz sampling rate).
+
+The interfaces offered are a front end modelled after compress(1), and
+a library API.  Compression and decompression run faster than realtime
+on most SPARCstations.  The implementation has been verified against the
+ETSI standard test patterns.
+
+Jutta Degener (jutta@cs.tu-berlin.de)
+Carsten Bormann (cabo@cs.tu-berlin.de)
+
+Communications and Operating Systems Research Group, TU Berlin
+Fax: +49.30.31425156, Phone: +49.30.31424315
+
+--
+Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
diff --git a/gsm/add.c b/gsm/add.c
new file mode 100644
index 0000000000..21ccfabe7b
--- /dev/null
+++ b/gsm/add.c
@@ -0,0 +1,235 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+/*
+ *  See private.h for the more commonly used macro versions.
+ */
+
+#include	<stdio.h>
+#include	<assert.h>
+
+#include	"private.h"
+#include	"gsm.h"
+#include	"proto.h"
+
+#define	saturate(x) 	\
+	((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x))
+
+word gsm_add P2((a,b), word a, word b)
+{
+	longword sum = (longword)a + (longword)b;
+	return saturate(sum);
+}
+
+word gsm_sub P2((a,b), word a, word b)
+{
+	longword diff = (longword)a - (longword)b;
+	return saturate(diff);
+}
+
+word gsm_mult P2((a,b), word a, word b)
+{
+	if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD;
+	else return SASR( (longword)a * (longword)b, 15 );
+}
+
+word gsm_mult_r P2((a,b), word a, word b)
+{
+	if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD;
+	else {
+		longword prod = (longword)a * (longword)b + 16384;
+		prod >>= 15;
+		return prod & 0xFFFF;
+	}
+}
+
+word gsm_abs P1((a), word a)
+{
+	return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a;
+}
+
+longword gsm_L_mult P2((a,b),word a, word b)
+{
+	assert( a != MIN_WORD || b != MIN_WORD );
+	return ((longword)a * (longword)b) << 1;
+}
+
+longword gsm_L_add P2((a,b), longword a, longword b)
+{
+	if (a < 0) {
+		if (b >= 0) return a + b;
+		else {
+			ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1);
+			return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2;
+		}
+	}
+	else if (b <= 0) return a + b;
+	else {
+		ulongword A = (ulongword)a + (ulongword)b;
+		return A > MAX_LONGWORD ? MAX_LONGWORD : A;
+	}
+}
+
+longword gsm_L_sub P2((a,b), longword a, longword b)
+{
+	if (a >= 0) {
+		if (b >= 0) return a - b;
+		else {
+			/* a>=0, b<0 */
+
+			ulongword A = (ulongword)a + -(b + 1);
+			return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1);
+		}
+	}
+	else if (b <= 0) return a - b;
+	else {
+		/* a<0, b>0 */  
+
+		ulongword A = (ulongword)-(a + 1) + b;
+		return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1;
+	}
+}
+
+static unsigned char const bitoff[ 256 ] = {
+	 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+	 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+	 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+word gsm_norm P1((a), longword a )
+/*
+ * the number of left shifts needed to normalize the 32 bit
+ * variable L_var1 for positive values on the interval
+ *
+ * with minimum of
+ * minimum of 1073741824  (01000000000000000000000000000000) and 
+ * maximum of 2147483647  (01111111111111111111111111111111)
+ *
+ *
+ * and for negative values on the interval with
+ * minimum of -2147483648 (-10000000000000000000000000000000) and
+ * maximum of -1073741824 ( -1000000000000000000000000000000).
+ *
+ * in order to normalize the result, the following
+ * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 );
+ *
+ * (That's 'ffs', only from the left, not the right..)
+ */
+{
+	assert(a != 0);
+
+	if (a < 0) {
+		if (a <= -1073741824) return 0;
+		a = ~a;
+	}
+
+	return    a & 0xffff0000 
+		? ( a & 0xff000000
+		  ?  -1 + bitoff[ 0xFF & (a >> 24) ]
+		  :   7 + bitoff[ 0xFF & (a >> 16) ] )
+		: ( a & 0xff00
+		  ?  15 + bitoff[ 0xFF & (a >> 8) ]
+		  :  23 + bitoff[ 0xFF & a ] );
+}
+
+longword gsm_L_asl P2((a,n), longword a, int n)
+{
+	if (n >= 32) return 0;
+	if (n <= -32) return -(a < 0);
+	if (n < 0) return gsm_L_asr(a, -n);
+	return a << n;
+}
+
+word gsm_asl P2((a,n), word a, int n)
+{
+	if (n >= 16) return 0;
+	if (n <= -16) return -(a < 0);
+	if (n < 0) return gsm_asr(a, -n);
+	return a << n;
+}
+
+longword gsm_L_asr P2((a,n), longword a, int n)
+{
+	if (n >= 32) return -(a < 0);
+	if (n <= -32) return 0;
+	if (n < 0) return a << -n;
+
+#	ifdef	SASR
+		return a >> n;
+#	else
+		if (a >= 0) return a >> n;
+		else return -(longword)( -(ulongword)a >> n );
+#	endif
+}
+
+word gsm_asr P2((a,n), word a, int n)
+{
+	if (n >= 16) return -(a < 0);
+	if (n <= -16) return 0;
+	if (n < 0) return a << -n;
+
+#	ifdef	SASR
+		return a >> n;
+#	else
+		if (a >= 0) return a >> n;
+		else return -(word)( -(uword)a >> n );
+#	endif
+}
+
+/* 
+ *  (From p. 46, end of section 4.2.5)
+ *
+ *  NOTE: The following lines gives [sic] one correct implementation
+ *  	  of the div(num, denum) arithmetic operation.  Compute div
+ *        which is the integer division of num by denum: with denum
+ *	  >= num > 0
+ */
+
+word gsm_div P2((num,denum), word num, word denum)
+{
+	longword	L_num   = num;
+	longword	L_denum = denum;
+	word		div 	= 0;
+	int		k 	= 15;
+
+	/* The parameter num sometimes becomes zero.
+	 * Although this is explicitly guarded against in 4.2.5,
+	 * we assume that the result should then be zero as well.
+	 */
+
+	/* assert(num != 0); */
+
+	assert(num >= 0 && denum >= num);
+	if (num == 0)
+	    return 0;
+
+	while (k--) {
+		div   <<= 1;
+		L_num <<= 1;
+
+		if (L_num >= L_denum) {
+			L_num -= L_denum;
+			div++;
+		}
+	}
+
+	return div;
+}
diff --git a/gsm/code.c b/gsm/code.c
new file mode 100644
index 0000000000..b7f8a236d1
--- /dev/null
+++ b/gsm/code.c
@@ -0,0 +1,101 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include	"config.h"
+
+
+//#ifdef	HAS_STDLIB_H
+//#include	<stdlib.h>
+#ifdef	HAS_STRING_H
+#include	<string.h>
+#else
+#	include "proto.h"
+	extern char	* memcpy P((char *, char *, int));
+#endif
+
+#include	"private.h"
+#include	"gsm.h"
+#include	"proto.h"
+
+/* 
+ *  4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER 
+ */
+
+void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc),
+
+	struct gsm_state	* S,
+
+	word	* s,	/* [0..159] samples		  	IN	*/
+
+/*
+ * The RPE-LTD coder works on a frame by frame basis.  The length of
+ * the frame is equal to 160 samples.  Some computations are done
+ * once per frame to produce at the output of the coder the
+ * LARc[1..8] parameters which are the coded LAR coefficients and 
+ * also to realize the inverse filtering operation for the entire
+ * frame (160 samples of signal d[0..159]).  These parts produce at
+ * the output of the coder:
+ */
+
+	word	* LARc,	/* [0..7] LAR coefficients		OUT	*/
+
+/*
+ * Procedure 4.2.11 to 4.2.18 are to be executed four times per
+ * frame.  That means once for each sub-segment RPE-LTP analysis of
+ * 40 samples.  These parts produce at the output of the coder:
+ */
+
+	word	* Nc,	/* [0..3] LTP lag			OUT 	*/
+	word	* bc,	/* [0..3] coded LTP gain		OUT 	*/
+	word	* Mc,	/* [0..3] RPE grid selection		OUT     */
+	word	* xmaxc,/* [0..3] Coded maximum amplitude	OUT	*/
+	word	* xMc	/* [13*4] normalized RPE samples	OUT	*/
+)
+{
+	int	k;
+	word	* dp  = S->dp0 + 120;	/* [ -120...-1 ] */
+	word	* dpp = dp;		/* [ 0...39 ]	 */
+
+	static word e[50];
+
+	word	so[160];
+
+	Gsm_Preprocess			(S, s, so);
+	Gsm_LPC_Analysis		(S, so, LARc);
+	Gsm_Short_Term_Analysis_Filter	(S, LARc, so);
+
+	for (k = 0; k <= 3; k++, xMc += 13) {
+
+		Gsm_Long_Term_Predictor	( S,
+					 so+k*40, /* d      [0..39] IN	*/
+					 dp,	  /* dp  [-120..-1] IN	*/
+					e + 5,	  /* e      [0..39] OUT	*/
+					dpp,	  /* dpp    [0..39] OUT */
+					 Nc++,
+					 bc++);
+
+		Gsm_RPE_Encoding	( S,
+					e + 5,	/* e	  ][0..39][ IN/OUT */
+					  xmaxc++, Mc++, xMc );
+		/*
+		 * Gsm_Update_of_reconstructed_short_time_residual_signal
+		 *			( dpp, e + 5, dp );
+		 */
+
+		{ register int i;
+		  register longword ltmp;
+		  for (i = 0; i <= 39; i++)
+			dp[ i ] = GSM_ADD( e[5 + i], dpp[i] );
+		}
+		dp  += 40;
+		dpp += 40;
+
+	}
+	(void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160),
+		120 * sizeof(*S->dp0) );
+}
diff --git a/gsm/config.h b/gsm/config.h
new file mode 100644
index 0000000000..ad57d91faf
--- /dev/null
+++ b/gsm/config.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header$*/
+
+#ifndef	CONFIG_H
+#define	CONFIG_H
+
+/*efine	SIGHANDLER_T	int */		/* signal handlers are void	*/
+/*efine HAS_SYSV_SIGNAL	1	*/	/* sigs not blocked/reset?	*/
+
+#define	HAS_STDLIB_H	1		/* /usr/include/stdlib.h	*/
+/*efine	HAS_LIMITS_H	1	*/	/* /usr/include/limits.h	*/
+#define	HAS_FCNTL_H	1		/* /usr/include/fcntl.h		*/
+/*efine	HAS_ERRNO_DECL	1	*/	/* errno.h declares errno	*/
+
+#define	HAS_FSTAT 	1		/* fstat syscall		*/
+#define	HAS_FCHMOD 	1		/* fchmod syscall		*/
+#define	HAS_CHMOD 	1		/* chmod syscall		*/
+#define	HAS_FCHOWN 	1		/* fchown syscall		*/
+#define	HAS_CHOWN 	1		/* chown syscall		*/
+/*efine	HAS__FSETMODE 	1	*/	/* _fsetmode -- set file mode	*/
+
+#define	HAS_STRING_H 	1		/* /usr/include/string.h 	*/
+/*efine	HAS_STRINGS_H	1	*/	/* /usr/include/strings.h 	*/
+
+#define	HAS_UNISTD_H	1		/* /usr/include/unistd.h	*/
+#define	HAS_UTIME	1		/* POSIX utime(path, times)	*/
+/*efine	HAS_UTIMES	1	*/	/* use utimes()	syscall instead	*/
+#define	HAS_UTIME_H	1		/* UTIME header file		*/
+/*efine	HAS_UTIMBUF	1	*/	/* struct utimbuf		*/
+/*efine	HAS_UTIMEUSEC   1*/		/* microseconds in utimbuf?	*/
+
+#endif	/* CONFIG_H */
diff --git a/gsm/debug.c b/gsm/debug.c
new file mode 100644
index 0000000000..e05210428f
--- /dev/null
+++ b/gsm/debug.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include "private.h"
+
+#ifndef	NDEBUG
+
+/* If NDEBUG _is_ defined and no debugging should be performed,
+ * calls to functions in this module are #defined to nothing
+ * in private.h.
+ */
+
+#include <stdio.h>
+#include "proto.h"
+
+void gsm_debug_words P4( (name, from, to, ptr), 
+	char 	      * name,
+	int		from,
+	int		to,
+	word		* ptr)
+{
+	int 	nprinted = 0;
+
+	fprintf( stderr, "%s [%d .. %d]: ", name, from, to );
+	while (from <= to) {
+		fprintf(stderr, "%d ", ptr[ from ] );
+		from++;
+		if (nprinted++ >= 7) {
+			nprinted = 0;
+			if (from < to) putc('\n', stderr);
+		}
+	}
+	putc('\n', stderr);
+}
+
+void gsm_debug_longwords P4( (name, from, to, ptr),
+	char 	      * name,
+	int		from,
+	int		to,
+	longword      * ptr)
+{
+	int 	nprinted = 0;
+
+	fprintf( stderr, "%s [%d .. %d]: ", name, from, to );
+	while (from <= to) {
+
+		fprintf(stderr, "%ld ", ptr[ from ] );
+		from++;
+		if (nprinted++ >= 7) {
+			nprinted = 0;
+			if (from < to) putc('\n', stderr);
+		}
+	}
+	putc('\n', stderr);
+}
+
+void gsm_debug_longword P2(  (name, value),
+	char		* name,
+	longword	  value	)
+{
+	fprintf(stderr, "%s: %ld\n", name, (long)value );
+}
+
+void gsm_debug_word P2(  (name, value),
+	char	* name,
+	word	  value	)
+{
+	fprintf(stderr, "%s: %ld\n", name, (long)value);
+}
+
+#endif
diff --git a/gsm/decode.c b/gsm/decode.c
new file mode 100644
index 0000000000..34e5586633
--- /dev/null
+++ b/gsm/decode.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include <stdio.h>
+
+#include	"private.h"
+#include	"gsm.h"
+#include	"proto.h"
+
+/*
+ *  4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER
+ */
+
+static void Postprocessing P2((S,s),
+	struct gsm_state	* S,
+	register word 		* s)
+{
+	register int		k;
+	register word		msr = S->msr;
+	register longword	ltmp;	/* for GSM_ADD */
+	register word		tmp;
+
+	for (k = 160; k--; s++) {
+		tmp = GSM_MULT_R( msr, 28180 );
+		msr = GSM_ADD(*s, tmp);  	   /* Deemphasis 	     */
+		*s  = GSM_ADD(msr, msr) & 0xFFF8;  /* Truncation & Upscaling */
+	}
+	S->msr = msr;
+}
+
+void Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s),
+	struct gsm_state	* S,
+
+	word		* LARcr,	/* [0..7]		IN	*/
+
+	word		* Ncr,		/* [0..3] 		IN 	*/
+	word		* bcr,		/* [0..3]		IN	*/
+	word		* Mcr,		/* [0..3] 		IN 	*/
+	word		* xmaxcr,	/* [0..3]		IN 	*/
+	word		* xMcr,		/* [0..13*4]		IN	*/
+
+	word		* s)		/* [0..159]		OUT 	*/
+{
+	int		j, k;
+	word		erp[40], wt[160];
+	word		* drp = S->dp0 + 120;
+
+	for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) {
+
+		Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp );
+		Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp );
+
+		for (k = 0; k <= 39; k++) wt[ j * 40 + k ] =  drp[ k ];
+	}
+
+	Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s );
+	Postprocessing(S, s);
+}
diff --git a/gsm/gsm.h b/gsm/gsm.h
new file mode 100644
index 0000000000..81065e5129
--- /dev/null
+++ b/gsm/gsm.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header$*/
+
+#ifndef	GSM_H
+#define	GSM_H
+
+#ifdef __cplusplus
+#	define	NeedFunctionPrototypes	1
+#endif
+
+#if __STDC__
+#	define	NeedFunctionPrototypes	1
+#endif
+
+#ifdef _NO_PROTO
+#	undef	NeedFunctionPrototypes
+#endif
+
+#ifdef NeedFunctionPrototypes
+#   include	<stdio.h>		/* for FILE * 	*/
+#endif
+
+#undef GSM_P
+#if NeedFunctionPrototypes
+#	define	GSM_P( protos )	protos
+#else
+#	define  GSM_P( protos )	( /* protos */ )
+#endif
+
+/*
+ *	Interface
+ */
+
+typedef struct gsm_state * 	gsm;
+typedef short		   	gsm_signal;		/* signed 16 bit */
+typedef unsigned char		gsm_byte;
+typedef gsm_byte 		gsm_frame[33];		/* 33 * 8 bits	 */
+
+#define	GSM_MAGIC		0xD		  	/* 13 kbit/s RPE-LTP */
+
+#define	GSM_PATCHLEVEL		10
+#define	GSM_MINOR		0
+#define	GSM_MAJOR		1
+
+#define	GSM_OPT_VERBOSE		1
+#define	GSM_OPT_FAST		2
+#define	GSM_OPT_LTP_CUT		3
+#define	GSM_OPT_WAV49		4
+#define	GSM_OPT_FRAME_INDEX	5
+#define	GSM_OPT_FRAME_CHAIN	6
+
+extern gsm  gsm_create 	GSM_P((void));
+extern void gsm_destroy GSM_P((gsm));	
+
+extern int  gsm_print   GSM_P((FILE *, gsm, gsm_byte  *));
+extern int  gsm_option  GSM_P((gsm, int, int *));
+
+extern void gsm_encode  GSM_P((gsm, gsm_signal *, gsm_byte  *));
+extern int  gsm_decode  GSM_P((gsm, gsm_byte   *, gsm_signal *));
+
+extern int  gsm_explode GSM_P((gsm, gsm_byte   *, gsm_signal *));
+extern void gsm_implode GSM_P((gsm, gsm_signal *, gsm_byte   *));
+
+#undef	GSM_P
+
+#endif	/* GSM_H */
diff --git a/gsm/gsm_create.c b/gsm/gsm_create.c
new file mode 100644
index 0000000000..a59aa2f2a3
--- /dev/null
+++ b/gsm/gsm_create.c
@@ -0,0 +1,45 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+static char const	ident[] = "$Header$";
+
+#include	"config.h"
+
+#ifdef	HAS_STRING_H
+#include	<string.h>
+#else
+#	include "proto.h"
+	extern char	* memset P((char *, int, int));
+#endif
+
+#ifdef	HAS_STDLIB_H
+#	include	<stdlib.h>
+#else
+#	ifdef	HAS_MALLOC_H
+#		include 	<malloc.h>
+#	else
+		extern char * malloc();
+#	endif
+#endif
+
+#include <stdio.h>
+
+#include "gsm.h"
+#include "private.h"
+#include "proto.h"
+
+gsm gsm_create P0()
+{
+	gsm  r;
+
+	r = (gsm)malloc(sizeof(struct gsm_state));
+	if (!r) return r;
+
+	memset((char *)r, 0, sizeof(*r));
+	r->nrp = 40;
+
+	return r;
+}
diff --git a/gsm/gsm_decode.c b/gsm/gsm_decode.c
new file mode 100644
index 0000000000..7318ba2d4d
--- /dev/null
+++ b/gsm/gsm_decode.c
@@ -0,0 +1,361 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)
+{
+	word  	LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+#ifdef WAV49
+	if (s->wav_fmt) {
+
+		uword sr = 0;
+
+		s->frame_index = !s->frame_index;
+		if (s->frame_index) {
+
+			sr = *c++;
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 2;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 4;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 2;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;			/* 5 */
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 10 */
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 15 */
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;			/* 20 */
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 25 */
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 30 */
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+
+			s->frame_chain = sr & 0xf;
+		}
+		else {
+			sr = s->frame_chain;
+			sr |= (uword)*c++ << 4;			/* 1 */
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr = *c++;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 3;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 5 */
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 10 */
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 15 */
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;			/* 20 */
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;	
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 25 */
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;		
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 30 */
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+		}
+	}
+	else
+#endif
+	{
+		/* GSM_MAGIC  = (*c >> 4) & 0xF; */
+
+		if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
+
+		LARc[0]  = (*c++ & 0xF) << 2;		/* 1 */
+		LARc[0] |= (*c >> 6) & 0x3;
+		LARc[1]  = *c++ & 0x3F;
+		LARc[2]  = (*c >> 3) & 0x1F;
+		LARc[3]  = (*c++ & 0x7) << 2;
+		LARc[3] |= (*c >> 6) & 0x3;
+		LARc[4]  = (*c >> 2) & 0xF;
+		LARc[5]  = (*c++ & 0x3) << 2;
+		LARc[5] |= (*c >> 6) & 0x3;
+		LARc[6]  = (*c >> 3) & 0x7;
+		LARc[7]  = *c++ & 0x7;
+		Nc[0]  = (*c >> 1) & 0x7F;
+		bc[0]  = (*c++ & 0x1) << 1;
+		bc[0] |= (*c >> 7) & 0x1;
+		Mc[0]  = (*c >> 5) & 0x3;
+		xmaxc[0]  = (*c++ & 0x1F) << 1;
+		xmaxc[0] |= (*c >> 7) & 0x1;
+		xmc[0]  = (*c >> 4) & 0x7;
+		xmc[1]  = (*c >> 1) & 0x7;
+		xmc[2]  = (*c++ & 0x1) << 2;
+		xmc[2] |= (*c >> 6) & 0x3;
+		xmc[3]  = (*c >> 3) & 0x7;
+		xmc[4]  = *c++ & 0x7;
+		xmc[5]  = (*c >> 5) & 0x7;
+		xmc[6]  = (*c >> 2) & 0x7;
+		xmc[7]  = (*c++ & 0x3) << 1;		/* 10 */
+		xmc[7] |= (*c >> 7) & 0x1;
+		xmc[8]  = (*c >> 4) & 0x7;
+		xmc[9]  = (*c >> 1) & 0x7;
+		xmc[10]  = (*c++ & 0x1) << 2;
+		xmc[10] |= (*c >> 6) & 0x3;
+		xmc[11]  = (*c >> 3) & 0x7;
+		xmc[12]  = *c++ & 0x7;
+		Nc[1]  = (*c >> 1) & 0x7F;
+		bc[1]  = (*c++ & 0x1) << 1;
+		bc[1] |= (*c >> 7) & 0x1;
+		Mc[1]  = (*c >> 5) & 0x3;
+		xmaxc[1]  = (*c++ & 0x1F) << 1;
+		xmaxc[1] |= (*c >> 7) & 0x1;
+		xmc[13]  = (*c >> 4) & 0x7;
+		xmc[14]  = (*c >> 1) & 0x7;
+		xmc[15]  = (*c++ & 0x1) << 2;
+		xmc[15] |= (*c >> 6) & 0x3;
+		xmc[16]  = (*c >> 3) & 0x7;
+		xmc[17]  = *c++ & 0x7;
+		xmc[18]  = (*c >> 5) & 0x7;
+		xmc[19]  = (*c >> 2) & 0x7;
+		xmc[20]  = (*c++ & 0x3) << 1;
+		xmc[20] |= (*c >> 7) & 0x1;
+		xmc[21]  = (*c >> 4) & 0x7;
+		xmc[22]  = (*c >> 1) & 0x7;
+		xmc[23]  = (*c++ & 0x1) << 2;
+		xmc[23] |= (*c >> 6) & 0x3;
+		xmc[24]  = (*c >> 3) & 0x7;
+		xmc[25]  = *c++ & 0x7;
+		Nc[2]  = (*c >> 1) & 0x7F;
+		bc[2]  = (*c++ & 0x1) << 1;		/* 20 */
+		bc[2] |= (*c >> 7) & 0x1;
+		Mc[2]  = (*c >> 5) & 0x3;
+		xmaxc[2]  = (*c++ & 0x1F) << 1;
+		xmaxc[2] |= (*c >> 7) & 0x1;
+		xmc[26]  = (*c >> 4) & 0x7;
+		xmc[27]  = (*c >> 1) & 0x7;
+		xmc[28]  = (*c++ & 0x1) << 2;
+		xmc[28] |= (*c >> 6) & 0x3;
+		xmc[29]  = (*c >> 3) & 0x7;
+		xmc[30]  = *c++ & 0x7;
+		xmc[31]  = (*c >> 5) & 0x7;
+		xmc[32]  = (*c >> 2) & 0x7;
+		xmc[33]  = (*c++ & 0x3) << 1;
+		xmc[33] |= (*c >> 7) & 0x1;
+		xmc[34]  = (*c >> 4) & 0x7;
+		xmc[35]  = (*c >> 1) & 0x7;
+		xmc[36]  = (*c++ & 0x1) << 2;
+		xmc[36] |= (*c >> 6) & 0x3;
+		xmc[37]  = (*c >> 3) & 0x7;
+		xmc[38]  = *c++ & 0x7;
+		Nc[3]  = (*c >> 1) & 0x7F;
+		bc[3]  = (*c++ & 0x1) << 1;
+		bc[3] |= (*c >> 7) & 0x1;
+		Mc[3]  = (*c >> 5) & 0x3;
+		xmaxc[3]  = (*c++ & 0x1F) << 1;
+		xmaxc[3] |= (*c >> 7) & 0x1;
+		xmc[39]  = (*c >> 4) & 0x7;
+		xmc[40]  = (*c >> 1) & 0x7;
+		xmc[41]  = (*c++ & 0x1) << 2;
+		xmc[41] |= (*c >> 6) & 0x3;
+		xmc[42]  = (*c >> 3) & 0x7;
+		xmc[43]  = *c++ & 0x7;			/* 30  */
+		xmc[44]  = (*c >> 5) & 0x7;
+		xmc[45]  = (*c >> 2) & 0x7;
+		xmc[46]  = (*c++ & 0x3) << 1;
+		xmc[46] |= (*c >> 7) & 0x1;
+		xmc[47]  = (*c >> 4) & 0x7;
+		xmc[48]  = (*c >> 1) & 0x7;
+		xmc[49]  = (*c++ & 0x1) << 2;
+		xmc[49] |= (*c >> 6) & 0x3;
+		xmc[50]  = (*c >> 3) & 0x7;
+		xmc[51]  = *c & 0x7;			/* 33 */
+	}
+
+	Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target);
+
+	return 0;
+}
diff --git a/gsm/gsm_destroy.c b/gsm/gsm_destroy.c
new file mode 100644
index 0000000000..4807c0acdd
--- /dev/null
+++ b/gsm/gsm_destroy.c
@@ -0,0 +1,26 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include "gsm.h"
+#include "config.h"
+#include "proto.h"
+
+#ifdef	HAS_STDLIB_H
+#	include	<stdlib.h>
+#else
+#	ifdef	HAS_MALLOC_H
+#		include 	<malloc.h>
+#	else
+		extern void free();
+#	endif
+#endif
+
+void gsm_destroy P1((S), gsm S)
+{
+	if (S) free((char *)S);
+}
diff --git a/gsm/gsm_encode.c b/gsm/gsm_encode.c
new file mode 100644
index 0000000000..62338300ee
--- /dev/null
+++ b/gsm/gsm_encode.c
@@ -0,0 +1,451 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include "private.h"
+#include "gsm.h"
+#include "proto.h"
+
+void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)
+{
+	word	 	LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+	Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc);
+
+
+	/*	variable	size
+
+		GSM_MAGIC	4
+
+		LARc[0]		6
+		LARc[1]		6
+		LARc[2]		5
+		LARc[3]		5
+		LARc[4]		4
+		LARc[5]		4
+		LARc[6]		3
+		LARc[7]		3
+
+		Nc[0]		7
+		bc[0]		2
+		Mc[0]		2
+		xmaxc[0]	6
+		xmc[0]		3
+		xmc[1]		3
+		xmc[2]		3
+		xmc[3]		3
+		xmc[4]		3
+		xmc[5]		3
+		xmc[6]		3
+		xmc[7]		3
+		xmc[8]		3
+		xmc[9]		3
+		xmc[10]		3
+		xmc[11]		3
+		xmc[12]		3
+
+		Nc[1]		7
+		bc[1]		2
+		Mc[1]		2
+		xmaxc[1]	6
+		xmc[13]		3
+		xmc[14]		3
+		xmc[15]		3
+		xmc[16]		3
+		xmc[17]		3
+		xmc[18]		3
+		xmc[19]		3
+		xmc[20]		3
+		xmc[21]		3
+		xmc[22]		3
+		xmc[23]		3
+		xmc[24]		3
+		xmc[25]		3
+
+		Nc[2]		7
+		bc[2]		2
+		Mc[2]		2
+		xmaxc[2]	6
+		xmc[26]		3
+		xmc[27]		3
+		xmc[28]		3
+		xmc[29]		3
+		xmc[30]		3
+		xmc[31]		3
+		xmc[32]		3
+		xmc[33]		3
+		xmc[34]		3
+		xmc[35]		3
+		xmc[36]		3
+		xmc[37]		3
+		xmc[38]		3
+
+		Nc[3]		7
+		bc[3]		2
+		Mc[3]		2
+		xmaxc[3]	6
+		xmc[39]		3
+		xmc[40]		3
+		xmc[41]		3
+		xmc[42]		3
+		xmc[43]		3
+		xmc[44]		3
+		xmc[45]		3
+		xmc[46]		3
+		xmc[47]		3
+		xmc[48]		3
+		xmc[49]		3
+		xmc[50]		3
+		xmc[51]		3
+	*/
+
+#ifdef WAV49
+
+	if (s->wav_fmt) {
+		s->frame_index = !s->frame_index;
+		if (s->frame_index) {
+
+			uword sr;
+
+			sr = 0;
+			sr = sr >> 6 | LARc[0] << 10;
+			sr = sr >> 6 | LARc[1] << 10;
+			*c++ = sr >> 4;
+			sr = sr >> 5 | LARc[2] << 11;
+			*c++ = sr >> 7;
+			sr = sr >> 5 | LARc[3] << 11;
+			sr = sr >> 4 | LARc[4] << 12;
+			*c++ = sr >> 6;
+			sr = sr >> 4 | LARc[5] << 12;
+			sr = sr >> 3 | LARc[6] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | LARc[7] << 13;
+			sr = sr >> 7 | Nc[0] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[0] << 14;
+			sr = sr >> 2 | Mc[0] << 14;
+			sr = sr >> 6 | xmaxc[0] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[0] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[1] << 13;
+			sr = sr >> 3 | xmc[2] << 13;
+			sr = sr >> 3 | xmc[3] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[4] << 13;
+			sr = sr >> 3 | xmc[5] << 13;
+			sr = sr >> 3 | xmc[6] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[7] << 13;
+			sr = sr >> 3 | xmc[8] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[9] << 13;
+			sr = sr >> 3 | xmc[10] << 13;
+			sr = sr >> 3 | xmc[11] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[12] << 13;
+			sr = sr >> 7 | Nc[1] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[1] << 14;
+			sr = sr >> 2 | Mc[1] << 14;
+			sr = sr >> 6 | xmaxc[1] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[13] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[14] << 13;
+			sr = sr >> 3 | xmc[15] << 13;
+			sr = sr >> 3 | xmc[16] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[17] << 13;
+			sr = sr >> 3 | xmc[18] << 13;
+			sr = sr >> 3 | xmc[19] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[20] << 13;
+			sr = sr >> 3 | xmc[21] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[22] << 13;
+			sr = sr >> 3 | xmc[23] << 13;
+			sr = sr >> 3 | xmc[24] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[25] << 13;
+			sr = sr >> 7 | Nc[2] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[2] << 14;
+			sr = sr >> 2 | Mc[2] << 14;
+			sr = sr >> 6 | xmaxc[2] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[26] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[27] << 13;
+			sr = sr >> 3 | xmc[28] << 13;
+			sr = sr >> 3 | xmc[29] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[30] << 13;
+			sr = sr >> 3 | xmc[31] << 13;
+			sr = sr >> 3 | xmc[32] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[33] << 13;
+			sr = sr >> 3 | xmc[34] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[35] << 13;
+			sr = sr >> 3 | xmc[36] << 13;
+			sr = sr >> 3 | xmc[37] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[38] << 13;
+			sr = sr >> 7 | Nc[3] << 9;
+			*c++ = sr >> 5;
+			sr = sr >> 2 | bc[3] << 14;
+			sr = sr >> 2 | Mc[3] << 14;
+			sr = sr >> 6 | xmaxc[3] << 10;
+			*c++ = sr >> 3;
+			sr = sr >> 3 | xmc[39] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[40] << 13;
+			sr = sr >> 3 | xmc[41] << 13;
+			sr = sr >> 3 | xmc[42] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[43] << 13;
+			sr = sr >> 3 | xmc[44] << 13;
+			sr = sr >> 3 | xmc[45] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[46] << 13;
+			sr = sr >> 3 | xmc[47] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[48] << 13;
+			sr = sr >> 3 | xmc[49] << 13;
+			sr = sr >> 3 | xmc[50] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[51] << 13;
+			sr = sr >> 4;
+			*c = sr >> 8;
+			s->frame_chain = *c;
+		}
+		else {
+			uword sr;
+
+			sr = 0;
+			sr = sr >> 4 | s->frame_chain << 12;
+			sr = sr >> 6 | LARc[0] << 10;
+			*c++ = sr >> 6;
+			sr = sr >> 6 | LARc[1] << 10;
+			*c++ = sr >> 8;
+			sr = sr >> 5 | LARc[2] << 11;
+			sr = sr >> 5 | LARc[3] << 11;
+			*c++ = sr >> 6;
+			sr = sr >> 4 | LARc[4] << 12;
+			sr = sr >> 4 | LARc[5] << 12;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | LARc[6] << 13;
+			sr = sr >> 3 | LARc[7] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[0] << 9;
+			sr = sr >> 2 | bc[0] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[0] << 14;
+			sr = sr >> 6 | xmaxc[0] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[0] << 13;
+			sr = sr >> 3 | xmc[1] << 13;
+			sr = sr >> 3 | xmc[2] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[3] << 13;
+			sr = sr >> 3 | xmc[4] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[5] << 13;
+			sr = sr >> 3 | xmc[6] << 13;
+			sr = sr >> 3 | xmc[7] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[8] << 13;
+			sr = sr >> 3 | xmc[9] << 13;
+			sr = sr >> 3 | xmc[10] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[11] << 13;
+			sr = sr >> 3 | xmc[12] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[1] << 9;
+			sr = sr >> 2 | bc[1] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[1] << 14;
+			sr = sr >> 6 | xmaxc[1] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[13] << 13;
+			sr = sr >> 3 | xmc[14] << 13;
+			sr = sr >> 3 | xmc[15] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[16] << 13;
+			sr = sr >> 3 | xmc[17] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[18] << 13;
+			sr = sr >> 3 | xmc[19] << 13;
+			sr = sr >> 3 | xmc[20] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[21] << 13;
+			sr = sr >> 3 | xmc[22] << 13;
+			sr = sr >> 3 | xmc[23] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[24] << 13;
+			sr = sr >> 3 | xmc[25] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[2] << 9;
+			sr = sr >> 2 | bc[2] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[2] << 14;
+			sr = sr >> 6 | xmaxc[2] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[26] << 13;
+			sr = sr >> 3 | xmc[27] << 13;
+			sr = sr >> 3 | xmc[28] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[29] << 13;
+			sr = sr >> 3 | xmc[30] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[31] << 13;
+			sr = sr >> 3 | xmc[32] << 13;
+			sr = sr >> 3 | xmc[33] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[34] << 13;
+			sr = sr >> 3 | xmc[35] << 13;
+			sr = sr >> 3 | xmc[36] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[37] << 13;
+			sr = sr >> 3 | xmc[38] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 7 | Nc[3] << 9;
+			sr = sr >> 2 | bc[3] << 14;
+			*c++ = sr >> 7;
+			sr = sr >> 2 | Mc[3] << 14;
+			sr = sr >> 6 | xmaxc[3] << 10;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[39] << 13;
+			sr = sr >> 3 | xmc[40] << 13;
+			sr = sr >> 3 | xmc[41] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[42] << 13;
+			sr = sr >> 3 | xmc[43] << 13;
+			*c++ = sr >> 8;
+			sr = sr >> 3 | xmc[44] << 13;
+			sr = sr >> 3 | xmc[45] << 13;
+			sr = sr >> 3 | xmc[46] << 13;
+			*c++ = sr >> 7;
+			sr = sr >> 3 | xmc[47] << 13;
+			sr = sr >> 3 | xmc[48] << 13;
+			sr = sr >> 3 | xmc[49] << 13;
+			*c++ = sr >> 6;
+			sr = sr >> 3 | xmc[50] << 13;
+			sr = sr >> 3 | xmc[51] << 13;
+			*c++ = sr >> 8;
+		}
+	}
+
+	else
+
+#endif	/* WAV49 */
+	{
+
+		*c++ =   ((GSM_MAGIC & 0xF) << 4)		/* 1 */
+		       | ((LARc[0] >> 2) & 0xF);
+		*c++ =   ((LARc[0] & 0x3) << 6)
+		       | (LARc[1] & 0x3F);
+		*c++ =   ((LARc[2] & 0x1F) << 3)
+		       | ((LARc[3] >> 2) & 0x7);
+		*c++ =   ((LARc[3] & 0x3) << 6)
+		       | ((LARc[4] & 0xF) << 2)
+		       | ((LARc[5] >> 2) & 0x3);
+		*c++ =   ((LARc[5] & 0x3) << 6)
+		       | ((LARc[6] & 0x7) << 3)
+		       | (LARc[7] & 0x7);
+		*c++ =   ((Nc[0] & 0x7F) << 1)
+		       | ((bc[0] >> 1) & 0x1);
+		*c++ =   ((bc[0] & 0x1) << 7)
+		       | ((Mc[0] & 0x3) << 5)
+		       | ((xmaxc[0] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[0] & 0x1) << 7)
+		       | ((xmc[0] & 0x7) << 4)
+		       | ((xmc[1] & 0x7) << 1)
+		       | ((xmc[2] >> 2) & 0x1);
+		*c++ =   ((xmc[2] & 0x3) << 6)
+		       | ((xmc[3] & 0x7) << 3)
+		       | (xmc[4] & 0x7);
+		*c++ =   ((xmc[5] & 0x7) << 5)			/* 10 */
+		       | ((xmc[6] & 0x7) << 2)
+		       | ((xmc[7] >> 1) & 0x3);
+		*c++ =   ((xmc[7] & 0x1) << 7)
+		       | ((xmc[8] & 0x7) << 4)
+		       | ((xmc[9] & 0x7) << 1)
+		       | ((xmc[10] >> 2) & 0x1);
+		*c++ =   ((xmc[10] & 0x3) << 6)
+		       | ((xmc[11] & 0x7) << 3)
+		       | (xmc[12] & 0x7);
+		*c++ =   ((Nc[1] & 0x7F) << 1)
+		       | ((bc[1] >> 1) & 0x1);
+		*c++ =   ((bc[1] & 0x1) << 7)
+		       | ((Mc[1] & 0x3) << 5)
+		       | ((xmaxc[1] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[1] & 0x1) << 7)
+		       | ((xmc[13] & 0x7) << 4)
+		       | ((xmc[14] & 0x7) << 1)
+		       | ((xmc[15] >> 2) & 0x1);
+		*c++ =   ((xmc[15] & 0x3) << 6)
+		       | ((xmc[16] & 0x7) << 3)
+		       | (xmc[17] & 0x7);
+		*c++ =   ((xmc[18] & 0x7) << 5)
+		       | ((xmc[19] & 0x7) << 2)
+		       | ((xmc[20] >> 1) & 0x3);
+		*c++ =   ((xmc[20] & 0x1) << 7)
+		       | ((xmc[21] & 0x7) << 4)
+		       | ((xmc[22] & 0x7) << 1)
+		       | ((xmc[23] >> 2) & 0x1);
+		*c++ =   ((xmc[23] & 0x3) << 6)
+		       | ((xmc[24] & 0x7) << 3)
+		       | (xmc[25] & 0x7);
+		*c++ =   ((Nc[2] & 0x7F) << 1)			/* 20 */
+		       | ((bc[2] >> 1) & 0x1);
+		*c++ =   ((bc[2] & 0x1) << 7)
+		       | ((Mc[2] & 0x3) << 5)
+		       | ((xmaxc[2] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[2] & 0x1) << 7)
+		       | ((xmc[26] & 0x7) << 4)
+		       | ((xmc[27] & 0x7) << 1)
+		       | ((xmc[28] >> 2) & 0x1);
+		*c++ =   ((xmc[28] & 0x3) << 6)
+		       | ((xmc[29] & 0x7) << 3)
+		       | (xmc[30] & 0x7);
+		*c++ =   ((xmc[31] & 0x7) << 5)
+		       | ((xmc[32] & 0x7) << 2)
+		       | ((xmc[33] >> 1) & 0x3);
+		*c++ =   ((xmc[33] & 0x1) << 7)
+		       | ((xmc[34] & 0x7) << 4)
+		       | ((xmc[35] & 0x7) << 1)
+		       | ((xmc[36] >> 2) & 0x1);
+		*c++ =   ((xmc[36] & 0x3) << 6)
+		       | ((xmc[37] & 0x7) << 3)
+		       | (xmc[38] & 0x7);
+		*c++ =   ((Nc[3] & 0x7F) << 1)
+		       | ((bc[3] >> 1) & 0x1);
+		*c++ =   ((bc[3] & 0x1) << 7)
+		       | ((Mc[3] & 0x3) << 5)
+		       | ((xmaxc[3] >> 1) & 0x1F);
+		*c++ =   ((xmaxc[3] & 0x1) << 7)
+		       | ((xmc[39] & 0x7) << 4)
+		       | ((xmc[40] & 0x7) << 1)
+		       | ((xmc[41] >> 2) & 0x1);
+		*c++ =   ((xmc[41] & 0x3) << 6)			/* 30 */
+		       | ((xmc[42] & 0x7) << 3)
+		       | (xmc[43] & 0x7);
+		*c++ =   ((xmc[44] & 0x7) << 5)
+		       | ((xmc[45] & 0x7) << 2)
+		       | ((xmc[46] >> 1) & 0x3);
+		*c++ =   ((xmc[46] & 0x1) << 7)
+		       | ((xmc[47] & 0x7) << 4)
+		       | ((xmc[48] & 0x7) << 1)
+		       | ((xmc[49] >> 2) & 0x1);
+		*c++ =   ((xmc[49] & 0x3) << 6)
+		       | ((xmc[50] & 0x7) << 3)
+		       | (xmc[51] & 0x7);
+
+	}
+}
diff --git a/gsm/gsm_explode.c b/gsm/gsm_explode.c
new file mode 100644
index 0000000000..a906fc2ed8
--- /dev/null
+++ b/gsm/gsm_explode.c
@@ -0,0 +1,417 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include "private.h"
+#include "gsm.h"
+#include "proto.h"
+
+int gsm_explode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target)
+{
+#	define	LARc	target
+#	define	Nc	*((gsm_signal (*) [17])(target + 8))
+#	define	bc	*((gsm_signal (*) [17])(target + 9))
+#	define	Mc	*((gsm_signal (*) [17])(target + 10))
+#	define	xmaxc	*((gsm_signal (*) [17])(target + 11))
+
+
+#ifdef WAV49
+	if (s->wav_fmt) {
+
+		uword sr = 0;
+
+		if (s->frame_index == 1) {
+
+			sr = *c++;
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 2;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 4;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 2;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;			/* 5 */
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(target + 12)
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 10 */
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(target + 29 - 13)
+
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 15 */
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;			/* 20 */
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+
+#undef	xmc
+#define	xmc	(target + 46 - 26)
+
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 25 */
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(target + 63 - 39)
+
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 30 */
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+
+			s->frame_chain = sr & 0xf;
+		}
+		else {
+			sr = s->frame_chain;
+			sr |= (uword)*c++ << 4;			/* 1 */
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr = *c++;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 3;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 5 */
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(target + 12)
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 10 */
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(target + 29 - 13)
+
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 15 */
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;			/* 20 */
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(target + 46 - 26)
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;	
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 25 */
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;		
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+
+#undef	xmc
+#define	xmc	(target + 63 - 39)
+
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 30 */
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+		}
+	}
+	else 
+#endif
+	{
+	/* GSM_MAGIC  = (*c >> 4) & 0xF; */
+
+	if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
+
+	LARc[0]  = (*c++ & 0xF) << 2;		/* 1 */
+	LARc[0] |= (*c >> 6) & 0x3;
+	LARc[1]  = *c++ & 0x3F;
+	LARc[2]  = (*c >> 3) & 0x1F;
+	LARc[3]  = (*c++ & 0x7) << 2;
+	LARc[3] |= (*c >> 6) & 0x3;
+	LARc[4]  = (*c >> 2) & 0xF;
+	LARc[5]  = (*c++ & 0x3) << 2;
+	LARc[5] |= (*c >> 6) & 0x3;
+	LARc[6]  = (*c >> 3) & 0x7;
+	LARc[7]  = *c++ & 0x7;
+
+	Nc[0]  = (*c >> 1) & 0x7F;
+
+	bc[0]  = (*c++ & 0x1) << 1;
+	bc[0] |= (*c >> 7) & 0x1;
+
+	Mc[0]  = (*c >> 5) & 0x3;
+
+	xmaxc[0]  = (*c++ & 0x1F) << 1;
+	xmaxc[0] |= (*c >> 7) & 0x1;
+
+#undef	xmc
+#define	xmc	(target + 12)
+
+	xmc[0]  = (*c >> 4) & 0x7;
+	xmc[1]  = (*c >> 1) & 0x7;
+	xmc[2]  = (*c++ & 0x1) << 2;
+	xmc[2] |= (*c >> 6) & 0x3;
+	xmc[3]  = (*c >> 3) & 0x7;
+	xmc[4]  = *c++ & 0x7;
+	xmc[5]  = (*c >> 5) & 0x7;
+	xmc[6]  = (*c >> 2) & 0x7;
+	xmc[7]  = (*c++ & 0x3) << 1;		/* 10 */
+	xmc[7] |= (*c >> 7) & 0x1;
+	xmc[8]  = (*c >> 4) & 0x7;
+	xmc[9]  = (*c >> 1) & 0x7;
+	xmc[10]  = (*c++ & 0x1) << 2;
+	xmc[10] |= (*c >> 6) & 0x3;
+	xmc[11]  = (*c >> 3) & 0x7;
+	xmc[12]  = *c++ & 0x7;
+
+	Nc[1]  = (*c >> 1) & 0x7F;
+
+	bc[1]  = (*c++ & 0x1) << 1;
+	bc[1] |= (*c >> 7) & 0x1;
+
+	Mc[1]  = (*c >> 5) & 0x3;
+
+	xmaxc[1]  = (*c++ & 0x1F) << 1;
+	xmaxc[1] |= (*c >> 7) & 0x1;
+
+#undef	xmc
+#define	xmc	(target + 29 - 13)
+
+	xmc[13]  = (*c >> 4) & 0x7;
+	xmc[14]  = (*c >> 1) & 0x7;
+	xmc[15]  = (*c++ & 0x1) << 2;
+	xmc[15] |= (*c >> 6) & 0x3;
+	xmc[16]  = (*c >> 3) & 0x7;
+	xmc[17]  = *c++ & 0x7;
+	xmc[18]  = (*c >> 5) & 0x7;
+	xmc[19]  = (*c >> 2) & 0x7;
+	xmc[20]  = (*c++ & 0x3) << 1;
+	xmc[20] |= (*c >> 7) & 0x1;
+	xmc[21]  = (*c >> 4) & 0x7;
+	xmc[22]  = (*c >> 1) & 0x7;
+	xmc[23]  = (*c++ & 0x1) << 2;
+	xmc[23] |= (*c >> 6) & 0x3;
+	xmc[24]  = (*c >> 3) & 0x7;
+	xmc[25]  = *c++ & 0x7;
+
+	Nc[2]  = (*c >> 1) & 0x7F;
+
+	bc[2]  = (*c++ & 0x1) << 1;		/* 20 */
+	bc[2] |= (*c >> 7) & 0x1;
+
+	Mc[2]  = (*c >> 5) & 0x3;
+
+	xmaxc[2]  = (*c++ & 0x1F) << 1;
+	xmaxc[2] |= (*c >> 7) & 0x1;
+
+#undef	xmc
+#define	xmc	(target + 46 - 26)
+
+	xmc[26]  = (*c >> 4) & 0x7;
+	xmc[27]  = (*c >> 1) & 0x7;
+	xmc[28]  = (*c++ & 0x1) << 2;
+	xmc[28] |= (*c >> 6) & 0x3;
+	xmc[29]  = (*c >> 3) & 0x7;
+	xmc[30]  = *c++ & 0x7;
+	xmc[31]  = (*c >> 5) & 0x7;
+	xmc[32]  = (*c >> 2) & 0x7;
+	xmc[33]  = (*c++ & 0x3) << 1;
+	xmc[33] |= (*c >> 7) & 0x1;
+	xmc[34]  = (*c >> 4) & 0x7;
+	xmc[35]  = (*c >> 1) & 0x7;
+	xmc[36]  = (*c++ & 0x1) << 2;
+	xmc[36] |= (*c >> 6) & 0x3;
+	xmc[37]  = (*c >> 3) & 0x7;
+	xmc[38]  = *c++ & 0x7;
+
+	Nc[3]  = (*c >> 1) & 0x7F;
+
+	bc[3]  = (*c++ & 0x1) << 1;
+	bc[3] |= (*c >> 7) & 0x1;
+
+	Mc[3]  = (*c >> 5) & 0x3;
+
+	xmaxc[3]  = (*c++ & 0x1F) << 1;
+	xmaxc[3] |= (*c >> 7) & 0x1;
+
+#undef	xmc
+#define	xmc	(target + 63 - 39)
+
+	xmc[39]  = (*c >> 4) & 0x7;
+	xmc[40]  = (*c >> 1) & 0x7;
+	xmc[41]  = (*c++ & 0x1) << 2;
+	xmc[41] |= (*c >> 6) & 0x3;
+	xmc[42]  = (*c >> 3) & 0x7;
+	xmc[43]  = *c++ & 0x7;			/* 30  */
+	xmc[44]  = (*c >> 5) & 0x7;
+	xmc[45]  = (*c >> 2) & 0x7;
+	xmc[46]  = (*c++ & 0x3) << 1;
+	xmc[46] |= (*c >> 7) & 0x1;
+	xmc[47]  = (*c >> 4) & 0x7;
+	xmc[48]  = (*c >> 1) & 0x7;
+	xmc[49]  = (*c++ & 0x1) << 2;
+	xmc[49] |= (*c >> 6) & 0x3;
+	xmc[50]  = (*c >> 3) & 0x7;
+	xmc[51]  = *c & 0x7;			/* 33 */
+	}
+
+	return 0;
+}
diff --git a/gsm/gsm_implode.c b/gsm/gsm_implode.c
new file mode 100644
index 0000000000..453b8cf390
--- /dev/null
+++ b/gsm/gsm_implode.c
@@ -0,0 +1,515 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+void gsm_implode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)
+{
+	/*	variable	size	index
+
+		GSM_MAGIC	4	-
+
+		LARc[0]		6	0
+		LARc[1]		6	1
+		LARc[2]		5	2
+		LARc[3]		5	3
+		LARc[4]		4	4
+		LARc[5]		4	5
+		LARc[6]		3	6
+		LARc[7]		3	7
+
+		Nc[0]		7	8
+		bc[0]		2	9
+		Mc[0]		2	10
+		xmaxc[0]	6	11
+		xmc[0]		3	12
+		xmc[1]		3	13
+		xmc[2]		3	14
+		xmc[3]		3	15
+		xmc[4]		3	16
+		xmc[5]		3	17
+		xmc[6]		3	18
+		xmc[7]		3	19
+		xmc[8]		3	20
+		xmc[9]		3	21
+		xmc[10]		3	22
+		xmc[11]		3	23
+		xmc[12]		3	24
+
+		Nc[1]		7	25
+		bc[1]		2	26
+		Mc[1]		2	27
+		xmaxc[1]	6	28
+		xmc[13]		3	29
+		xmc[14]		3	30
+		xmc[15]		3	31
+		xmc[16]		3	32
+		xmc[17]		3	33
+		xmc[18]		3	34
+		xmc[19]		3	35
+		xmc[20]		3	36
+		xmc[21]		3	37
+		xmc[22]		3	38
+		xmc[23]		3	39
+		xmc[24]		3	40
+		xmc[25]		3	41
+
+		Nc[2]		7	42
+		bc[2]		2	43
+		Mc[2]		2	44
+		xmaxc[2]	6	45
+		xmc[26]		3	46
+		xmc[27]		3	47
+		xmc[28]		3	48
+		xmc[29]		3	49
+		xmc[30]		3	50
+		xmc[31]		3	51
+		xmc[32]		3	52
+		xmc[33]		3	53
+		xmc[34]		3	54
+		xmc[35]		3	55
+		xmc[36]		3	56
+		xmc[37]		3	57
+		xmc[38]		3	58
+
+		Nc[3]		7	59
+		bc[3]		2	60
+		Mc[3]		2	61
+		xmaxc[3]	6	62
+		xmc[39]		3	63
+		xmc[40]		3	64
+		xmc[41]		3	65
+		xmc[42]		3	66
+		xmc[43]		3	67
+		xmc[44]		3	68
+		xmc[45]		3	69
+		xmc[46]		3	70
+		xmc[47]		3	71
+		xmc[48]		3	72
+		xmc[49]		3	73
+		xmc[50]		3	74
+		xmc[51]		3	75
+	*/
+
+	/*	There are 76 parameters per frame.  The first eight are
+	 * 	unique.  The remaining 68 are four identical subframes of
+	 * 	17 parameters each.  gsm_implode converts from a representation
+	 * 	of these parameters as values in one array of signed words
+	 * 	to the "packed" version of a GSM frame.
+	 */
+
+#	define	LARc	source
+#	define	Nc	*((gsm_signal (*) [17])(source + 8))
+#	define	bc	*((gsm_signal (*) [17])(source + 9))
+#	define	Mc	*((gsm_signal (*) [17])(source + 10))
+#	define	xmaxc	*((gsm_signal (*) [17])(source + 11))
+
+#ifdef WAV49
+	if (s->wav_fmt) {
+
+		uword sr = 0;
+		if (s->frame_index == 0) {
+
+			sr = *c++;
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 2;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr |= (uword)*c++ << 4;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 2;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;			/* 5 */
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(source + 12)
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 10 */
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(source + 29 - 13)
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 15 */
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;			/* 20 */
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(source + 46 - 26)
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 25 */
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 4;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 1;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(source + 63 - 39)
+
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 30 */
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+
+			s->frame_chain = sr & 0xf;
+		}
+		else {
+			sr = s->frame_chain;
+			sr |= (uword)*c++ << 4;			/* 1 */
+			LARc[0] = sr & 0x3f;  sr >>= 6;
+			LARc[1] = sr & 0x3f;  sr >>= 6;
+			sr = *c++;
+			LARc[2] = sr & 0x1f;  sr >>= 5;
+			sr |= (uword)*c++ << 3;
+			LARc[3] = sr & 0x1f;  sr >>= 5;
+			LARc[4] = sr & 0xf;  sr >>= 4;
+			sr |= (uword)*c++ << 2;
+			LARc[5] = sr & 0xf;  sr >>= 4;
+			LARc[6] = sr & 0x7;  sr >>= 3;
+			LARc[7] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 5 */
+			Nc[0] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[0] = sr & 0x3;  sr >>= 2;
+			Mc[0] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[0] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(source + 12)
+			xmc[0] = sr & 0x7;  sr >>= 3;
+			xmc[1] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[2] = sr & 0x7;  sr >>= 3;
+			xmc[3] = sr & 0x7;  sr >>= 3;
+			xmc[4] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[5] = sr & 0x7;  sr >>= 3;
+			xmc[6] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;			/* 10 */
+			xmc[7] = sr & 0x7;  sr >>= 3;
+			xmc[8] = sr & 0x7;  sr >>= 3;
+			xmc[9] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[10] = sr & 0x7;  sr >>= 3;
+			xmc[11] = sr & 0x7;  sr >>= 3;
+			xmc[12] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[1] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;
+			bc[1] = sr & 0x3;  sr >>= 2;
+			Mc[1] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[1] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(source + 29 - 13)
+			xmc[13] = sr & 0x7;  sr >>= 3;
+			xmc[14] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 15 */
+			xmc[15] = sr & 0x7;  sr >>= 3;
+			xmc[16] = sr & 0x7;  sr >>= 3;
+			xmc[17] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[18] = sr & 0x7;  sr >>= 3;
+			xmc[19] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[20] = sr & 0x7;  sr >>= 3;
+			xmc[21] = sr & 0x7;  sr >>= 3;
+			xmc[22] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[23] = sr & 0x7;  sr >>= 3;
+			xmc[24] = sr & 0x7;  sr >>= 3;
+			xmc[25] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[2] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;			/* 20 */
+			bc[2] = sr & 0x3;  sr >>= 2;
+			Mc[2] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[2] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(source + 46 - 26)
+			xmc[26] = sr & 0x7;  sr >>= 3;
+			xmc[27] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;	
+			xmc[28] = sr & 0x7;  sr >>= 3;
+			xmc[29] = sr & 0x7;  sr >>= 3;
+			xmc[30] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			xmc[31] = sr & 0x7;  sr >>= 3;
+			xmc[32] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[33] = sr & 0x7;  sr >>= 3;
+			xmc[34] = sr & 0x7;  sr >>= 3;
+			xmc[35] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;			/* 25 */
+			xmc[36] = sr & 0x7;  sr >>= 3;
+			xmc[37] = sr & 0x7;  sr >>= 3;
+			xmc[38] = sr & 0x7;  sr >>= 3;
+			sr = *c++;
+			Nc[3] = sr & 0x7f;  sr >>= 7;
+			sr |= (uword)*c++ << 1;		
+			bc[3] = sr & 0x3;  sr >>= 2;
+			Mc[3] = sr & 0x3;  sr >>= 2;
+			sr |= (uword)*c++ << 5;
+			xmaxc[3] = sr & 0x3f;  sr >>= 6;
+#undef	xmc
+#define	xmc	(source + 63 - 39)
+
+			xmc[39] = sr & 0x7;  sr >>= 3;
+			xmc[40] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[41] = sr & 0x7;  sr >>= 3;
+			xmc[42] = sr & 0x7;  sr >>= 3;
+			xmc[43] = sr & 0x7;  sr >>= 3;
+			sr = *c++;				/* 30 */
+			xmc[44] = sr & 0x7;  sr >>= 3;
+			xmc[45] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 2;
+			xmc[46] = sr & 0x7;  sr >>= 3;
+			xmc[47] = sr & 0x7;  sr >>= 3;
+			xmc[48] = sr & 0x7;  sr >>= 3;
+			sr |= (uword)*c++ << 1;
+			xmc[49] = sr & 0x7;  sr >>= 3;
+			xmc[50] = sr & 0x7;  sr >>= 3;
+			xmc[51] = sr & 0x7;  sr >>= 3;
+		}
+	}
+	else
+#endif 
+	{
+
+	*c++ =   ((GSM_MAGIC & 0xF) << 4)		/* 1 */
+	       | ((LARc[0] >> 2) & 0xF);
+	*c++ =   ((LARc[0] & 0x3) << 6)
+	       | (LARc[1] & 0x3F);
+	*c++ =   ((LARc[2] & 0x1F) << 3)
+	       | ((LARc[3] >> 2) & 0x7);
+	*c++ =   ((LARc[3] & 0x3) << 6)
+	       | ((LARc[4] & 0xF) << 2)
+	       | ((LARc[5] >> 2) & 0x3);
+	*c++ =   ((LARc[5] & 0x3) << 6)
+	       | ((LARc[6] & 0x7) << 3)
+	       | (LARc[7] & 0x7);
+
+
+	*c++ =   ((Nc[0] & 0x7F) << 1)
+
+
+	       | ((bc[0] >> 1) & 0x1);
+	*c++ =   ((bc[0] & 0x1) << 7)
+
+
+	       | ((Mc[0] & 0x3) << 5)
+
+	       | ((xmaxc[0] >> 1) & 0x1F);
+	*c++ =   ((xmaxc[0] & 0x1) << 7)
+
+#undef xmc
+#define	xmc	(source + 12)
+
+	       | ((xmc[0] & 0x7) << 4)
+	       | ((xmc[1] & 0x7) << 1)
+	       | ((xmc[2] >> 2) & 0x1);
+	*c++ =   ((xmc[2] & 0x3) << 6)
+	       | ((xmc[3] & 0x7) << 3)
+	       | (xmc[4] & 0x7);
+	*c++ =   ((xmc[5] & 0x7) << 5)			/* 10 */
+	       | ((xmc[6] & 0x7) << 2)
+	       | ((xmc[7] >> 1) & 0x3);
+	*c++ =   ((xmc[7] & 0x1) << 7)
+	       | ((xmc[8] & 0x7) << 4)
+	       | ((xmc[9] & 0x7) << 1)
+	       | ((xmc[10] >> 2) & 0x1);
+	*c++ =   ((xmc[10] & 0x3) << 6)
+	       | ((xmc[11] & 0x7) << 3)
+	       | (xmc[12] & 0x7);
+
+
+	*c++ =   ((Nc[1] & 0x7F) << 1)
+
+
+	       | ((bc[1] >> 1) & 0x1);
+	*c++ =   ((bc[1] & 0x1) << 7)
+
+
+	       | ((Mc[1] & 0x3) << 5)
+
+
+	       | ((xmaxc[1] >> 1) & 0x1F);
+	*c++ =   ((xmaxc[1] & 0x1) << 7)
+
+#undef	xmc
+#define	xmc	(source + 29 - 13)
+
+	       | ((xmc[13] & 0x7) << 4)
+	       | ((xmc[14] & 0x7) << 1)
+	       | ((xmc[15] >> 2) & 0x1);
+	*c++ =   ((xmc[15] & 0x3) << 6)
+	       | ((xmc[16] & 0x7) << 3)
+	       | (xmc[17] & 0x7);
+	*c++ =   ((xmc[18] & 0x7) << 5)
+	       | ((xmc[19] & 0x7) << 2)
+	       | ((xmc[20] >> 1) & 0x3);
+	*c++ =   ((xmc[20] & 0x1) << 7)
+	       | ((xmc[21] & 0x7) << 4)
+	       | ((xmc[22] & 0x7) << 1)
+	       | ((xmc[23] >> 2) & 0x1);
+	*c++ =   ((xmc[23] & 0x3) << 6)
+	       | ((xmc[24] & 0x7) << 3)
+	       | (xmc[25] & 0x7);
+
+
+	*c++ =   ((Nc[2] & 0x7F) << 1)			/* 20 */
+
+
+	       | ((bc[2] >> 1) & 0x1);
+	*c++ =   ((bc[2] & 0x1) << 7)
+
+
+	       | ((Mc[2] & 0x3) << 5)
+
+
+	       | ((xmaxc[2] >> 1) & 0x1F);
+	*c++ =   ((xmaxc[2] & 0x1) << 7)
+
+#undef	xmc
+#define	xmc	(source + 46 - 26)
+
+	       | ((xmc[26] & 0x7) << 4)
+	       | ((xmc[27] & 0x7) << 1)
+	       | ((xmc[28] >> 2) & 0x1);
+	*c++ =   ((xmc[28] & 0x3) << 6)
+	       | ((xmc[29] & 0x7) << 3)
+	       | (xmc[30] & 0x7);
+	*c++ =   ((xmc[31] & 0x7) << 5)
+	       | ((xmc[32] & 0x7) << 2)
+	       | ((xmc[33] >> 1) & 0x3);
+	*c++ =   ((xmc[33] & 0x1) << 7)
+	       | ((xmc[34] & 0x7) << 4)
+	       | ((xmc[35] & 0x7) << 1)
+	       | ((xmc[36] >> 2) & 0x1);
+	*c++ =   ((xmc[36] & 0x3) << 6)
+	       | ((xmc[37] & 0x7) << 3)
+	       | (xmc[38] & 0x7);
+
+
+	*c++ =   ((Nc[3] & 0x7F) << 1)
+
+
+	       | ((bc[3] >> 1) & 0x1);
+	*c++ =   ((bc[3] & 0x1) << 7)
+
+
+	       | ((Mc[3] & 0x3) << 5)
+
+
+	       | ((xmaxc[3] >> 1) & 0x1F);
+	*c++ =   ((xmaxc[3] & 0x1) << 7)
+
+#undef	xmc
+#define	xmc	(source + 63 - 39)
+
+	       | ((xmc[39] & 0x7) << 4)
+	       | ((xmc[40] & 0x7) << 1)
+	       | ((xmc[41] >> 2) & 0x1);
+	*c++ =   ((xmc[41] & 0x3) << 6)			/* 30 */
+	       | ((xmc[42] & 0x7) << 3)
+	       | (xmc[43] & 0x7);
+	*c++ =   ((xmc[44] & 0x7) << 5)
+	       | ((xmc[45] & 0x7) << 2)
+	       | ((xmc[46] >> 1) & 0x3);
+	*c++ =   ((xmc[46] & 0x1) << 7)
+	       | ((xmc[47] & 0x7) << 4)
+	       | ((xmc[48] & 0x7) << 1)
+	       | ((xmc[49] >> 2) & 0x1);
+	*c++ =   ((xmc[49] & 0x3) << 6)
+	       | ((xmc[50] & 0x7) << 3)
+	       | (xmc[51] & 0x7);
+	}
+}
diff --git a/gsm/gsm_option.c b/gsm/gsm_option.c
new file mode 100644
index 0000000000..2807801328
--- /dev/null
+++ b/gsm/gsm_option.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+int gsm_option P3((r, opt, val), gsm r, int opt, int * val)
+{
+	int 	result = -1;
+
+	switch (opt) {
+	case GSM_OPT_LTP_CUT:
+#ifdef 	LTP_CUT
+		result = r->ltp_cut;
+		if (val) r->ltp_cut = *val;
+#endif
+		break;
+
+	case GSM_OPT_VERBOSE:
+#ifndef	NDEBUG
+		result = r->verbose;
+		if (val) r->verbose = *val;
+#endif
+		break;
+
+	case GSM_OPT_FAST:
+
+#if	defined(FAST) && defined(USE_FLOAT_MUL)
+		result = r->fast;
+		if (val) r->fast = !!*val;
+#endif
+		break;
+
+	case GSM_OPT_FRAME_CHAIN:
+
+#ifdef WAV49
+		result = r->frame_chain;
+		if (val) r->frame_chain = *val;
+#endif
+		break;
+
+	case GSM_OPT_FRAME_INDEX:
+
+#ifdef WAV49
+		result = r->frame_index;
+		if (val) r->frame_index = *val;
+#endif
+		break;
+
+	case GSM_OPT_WAV49:
+
+#ifdef WAV49 
+		result = r->wav_fmt;
+		if (val) r->wav_fmt = !!*val;
+#endif
+		break;
+
+	default:
+		break;
+	}
+	return result;
+}
diff --git a/gsm/gsm_print.c b/gsm/gsm_print.c
new file mode 100644
index 0000000000..af745bc48a
--- /dev/null
+++ b/gsm/gsm_print.c
@@ -0,0 +1,167 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include	<stdio.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+int gsm_print P3((f, s, c), FILE * f, gsm s, gsm_byte * c)
+{
+	word  	LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4];
+
+	/* GSM_MAGIC  = (*c >> 4) & 0xF; */
+
+	if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1;
+
+	LARc[0]  = (*c++ & 0xF) << 2;		/* 1 */
+	LARc[0] |= (*c >> 6) & 0x3;
+	LARc[1]  = *c++ & 0x3F;
+	LARc[2]  = (*c >> 3) & 0x1F;
+	LARc[3]  = (*c++ & 0x7) << 2;
+	LARc[3] |= (*c >> 6) & 0x3;
+	LARc[4]  = (*c >> 2) & 0xF;
+	LARc[5]  = (*c++ & 0x3) << 2;
+	LARc[5] |= (*c >> 6) & 0x3;
+	LARc[6]  = (*c >> 3) & 0x7;
+	LARc[7]  = *c++ & 0x7;
+
+
+	Nc[0]  = (*c >> 1) & 0x7F;
+	bc[0]  = (*c++ & 0x1) << 1;
+	bc[0] |= (*c >> 7) & 0x1;
+	Mc[0]  = (*c >> 5) & 0x3;
+	xmaxc[0]  = (*c++ & 0x1F) << 1;
+	xmaxc[0] |= (*c >> 7) & 0x1;
+	xmc[0]  = (*c >> 4) & 0x7;
+	xmc[1]  = (*c >> 1) & 0x7;
+	xmc[2]  = (*c++ & 0x1) << 2;
+	xmc[2] |= (*c >> 6) & 0x3;
+	xmc[3]  = (*c >> 3) & 0x7;
+	xmc[4]  = *c++ & 0x7;
+	xmc[5]  = (*c >> 5) & 0x7;
+	xmc[6]  = (*c >> 2) & 0x7;
+	xmc[7]  = (*c++ & 0x3) << 1;		/* 10 */
+	xmc[7] |= (*c >> 7) & 0x1;
+	xmc[8]  = (*c >> 4) & 0x7;
+	xmc[9]  = (*c >> 1) & 0x7;
+	xmc[10]  = (*c++ & 0x1) << 2;
+	xmc[10] |= (*c >> 6) & 0x3;
+	xmc[11]  = (*c >> 3) & 0x7;
+	xmc[12]  = *c++ & 0x7;
+
+	Nc[1]  = (*c >> 1) & 0x7F;
+	bc[1]  = (*c++ & 0x1) << 1;
+	bc[1] |= (*c >> 7) & 0x1;
+	Mc[1]  = (*c >> 5) & 0x3;
+	xmaxc[1]  = (*c++ & 0x1F) << 1;
+	xmaxc[1] |= (*c >> 7) & 0x1;
+	xmc[13]  = (*c >> 4) & 0x7;
+	xmc[14]  = (*c >> 1) & 0x7;
+	xmc[15]  = (*c++ & 0x1) << 2;
+	xmc[15] |= (*c >> 6) & 0x3;
+	xmc[16]  = (*c >> 3) & 0x7;
+	xmc[17]  = *c++ & 0x7;
+	xmc[18]  = (*c >> 5) & 0x7;
+	xmc[19]  = (*c >> 2) & 0x7;
+	xmc[20]  = (*c++ & 0x3) << 1;
+	xmc[20] |= (*c >> 7) & 0x1;
+	xmc[21]  = (*c >> 4) & 0x7;
+	xmc[22]  = (*c >> 1) & 0x7;
+	xmc[23]  = (*c++ & 0x1) << 2;
+	xmc[23] |= (*c >> 6) & 0x3;
+	xmc[24]  = (*c >> 3) & 0x7;
+	xmc[25]  = *c++ & 0x7;
+
+
+	Nc[2]  = (*c >> 1) & 0x7F;
+	bc[2]  = (*c++ & 0x1) << 1;		/* 20 */
+	bc[2] |= (*c >> 7) & 0x1;
+	Mc[2]  = (*c >> 5) & 0x3;
+	xmaxc[2]  = (*c++ & 0x1F) << 1;
+	xmaxc[2] |= (*c >> 7) & 0x1;
+	xmc[26]  = (*c >> 4) & 0x7;
+	xmc[27]  = (*c >> 1) & 0x7;
+	xmc[28]  = (*c++ & 0x1) << 2;
+	xmc[28] |= (*c >> 6) & 0x3;
+	xmc[29]  = (*c >> 3) & 0x7;
+	xmc[30]  = *c++ & 0x7;
+	xmc[31]  = (*c >> 5) & 0x7;
+	xmc[32]  = (*c >> 2) & 0x7;
+	xmc[33]  = (*c++ & 0x3) << 1;
+	xmc[33] |= (*c >> 7) & 0x1;
+	xmc[34]  = (*c >> 4) & 0x7;
+	xmc[35]  = (*c >> 1) & 0x7;
+	xmc[36]  = (*c++ & 0x1) << 2;
+	xmc[36] |= (*c >> 6) & 0x3;
+	xmc[37]  = (*c >> 3) & 0x7;
+	xmc[38]  = *c++ & 0x7;
+
+	Nc[3]  = (*c >> 1) & 0x7F;
+	bc[3]  = (*c++ & 0x1) << 1;
+	bc[3] |= (*c >> 7) & 0x1;
+	Mc[3]  = (*c >> 5) & 0x3;
+	xmaxc[3]  = (*c++ & 0x1F) << 1;
+	xmaxc[3] |= (*c >> 7) & 0x1;
+
+	xmc[39]  = (*c >> 4) & 0x7;
+	xmc[40]  = (*c >> 1) & 0x7;
+	xmc[41]  = (*c++ & 0x1) << 2;
+	xmc[41] |= (*c >> 6) & 0x3;
+	xmc[42]  = (*c >> 3) & 0x7;
+	xmc[43]  = *c++ & 0x7;			/* 30  */
+	xmc[44]  = (*c >> 5) & 0x7;
+	xmc[45]  = (*c >> 2) & 0x7;
+	xmc[46]  = (*c++ & 0x3) << 1;
+	xmc[46] |= (*c >> 7) & 0x1;
+	xmc[47]  = (*c >> 4) & 0x7;
+	xmc[48]  = (*c >> 1) & 0x7;
+	xmc[49]  = (*c++ & 0x1) << 2;
+	xmc[49] |= (*c >> 6) & 0x3;
+	xmc[50]  = (*c >> 3) & 0x7;
+	xmc[51]  = *c & 0x7;			/* 33 */
+
+	fprintf(f,
+	      "LARc:\t%2.2d  %2.2d  %2.2d  %2.2d  %2.2d  %2.2d  %2.2d  %2.2d\n",
+	       LARc[0],LARc[1],LARc[2],LARc[3],LARc[4],LARc[5],LARc[6],LARc[7]);
+
+	fprintf(f, "#1: 	Nc %4.4d    bc %d    Mc %d    xmaxc %d\n",
+		Nc[0], bc[0], Mc[0], xmaxc[0]);
+	fprintf(f,
+"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",
+		xmc[0],xmc[1],xmc[2],xmc[3],xmc[4],xmc[5],xmc[6],
+		xmc[7],xmc[8],xmc[9],xmc[10],xmc[11],xmc[12] );
+
+	fprintf(f, "#2: 	Nc %4.4d    bc %d    Mc %d    xmaxc %d\n",
+		Nc[1], bc[1], Mc[1], xmaxc[1]);
+	fprintf(f,
+"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",
+		xmc[13+0],xmc[13+1],xmc[13+2],xmc[13+3],xmc[13+4],xmc[13+5],
+		xmc[13+6], xmc[13+7],xmc[13+8],xmc[13+9],xmc[13+10],xmc[13+11],
+		xmc[13+12] );
+
+	fprintf(f, "#3: 	Nc %4.4d    bc %d    Mc %d    xmaxc %d\n",
+		Nc[2], bc[2], Mc[2], xmaxc[2]);
+	fprintf(f,
+"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",
+		xmc[26+0],xmc[26+1],xmc[26+2],xmc[26+3],xmc[26+4],xmc[26+5],
+		xmc[26+6], xmc[26+7],xmc[26+8],xmc[26+9],xmc[26+10],xmc[26+11],
+		xmc[26+12] );
+
+	fprintf(f, "#4: 	Nc %4.4d    bc %d    Mc %d    xmaxc %d\n",
+		Nc[3], bc[3], Mc[3], xmaxc[3]);
+	fprintf(f,
+"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n",
+		xmc[39+0],xmc[39+1],xmc[39+2],xmc[39+3],xmc[39+4],xmc[39+5],
+		xmc[39+6], xmc[39+7],xmc[39+8],xmc[39+9],xmc[39+10],xmc[39+11],
+		xmc[39+12] );
+
+	return 0;
+}
diff --git a/gsm/long_term.c b/gsm/long_term.c
new file mode 100644
index 0000000000..fd67bda193
--- /dev/null
+++ b/gsm/long_term.c
@@ -0,0 +1,949 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+/*
+ *  4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION
+ */
+
+
+/*
+ * This module computes the LTP gain (bc) and the LTP lag (Nc)
+ * for the long term analysis filter.   This is done by calculating a
+ * maximum of the cross-correlation function between the current
+ * sub-segment short term residual signal d[0..39] (output of
+ * the short term analysis filter; for simplification the index
+ * of this array begins at 0 and ends at 39 for each sub-segment of the
+ * RPE-LTP analysis) and the previous reconstructed short term
+ * residual signal dp[ -120 .. -1 ].  A dynamic scaling must be
+ * performed to avoid overflow.
+ */
+
+ /* The next procedure exists in six versions.  First two integer
+  * version (if USE_FLOAT_MUL is not defined); then four floating
+  * point versions, twice with proper scaling (USE_FLOAT_MUL defined),
+  * once without (USE_FLOAT_MUL and FAST defined, and fast run-time
+  * option used).  Every pair has first a Cut version (see the -C
+  * option to toast or the LTP_CUT option to gsm_option()), then the
+  * uncut one.  (For a detailed explanation of why this is altogether
+  * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered
+  * Harmful''.)
+  */
+
+#ifndef  USE_FLOAT_MUL
+
+#ifdef	LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),
+
+	struct gsm_state * st,
+
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+	word		wt[40];
+
+	longword	L_result;
+	longword	L_max, L_power;
+	word		R, S, dmax, scal, best_k;
+	word		ltp_cut;
+
+	register word	temp, wt_k;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) {
+			dmax = temp;
+			best_k = k;
+		}
+	}
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+	assert(scal >= 0);
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+	wt_k  = SASR(d[best_k], scal);
+
+	for (lambda = 40; lambda <= 120; lambda++) {
+		L_result = (longword)wt_k * dp[best_k - lambda];
+		if (L_result > L_max) {
+			Nc    = lambda;
+			L_max = L_result;
+		}
+	}
+	*Nc_out = Nc;
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >= -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#endif 	/* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+	word		wt[40];
+
+	longword	L_max, L_power;
+	word		R, S, dmax, scal;
+	register word	temp;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) dmax = temp;
+	}
+
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+
+	assert(scal >= 0);
+
+	/*  Initialization of a working array wt
+	 */
+
+	for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal );
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda++) {
+
+# undef STEP
+#		define STEP(k) 	(longword)wt[k] * dp[k - lambda]
+
+		register longword L_result;
+
+		L_result  = STEP(0)  ; L_result += STEP(1) ;
+		L_result += STEP(2)  ; L_result += STEP(3) ;
+		L_result += STEP(4)  ; L_result += STEP(5)  ;
+		L_result += STEP(6)  ; L_result += STEP(7)  ;
+		L_result += STEP(8)  ; L_result += STEP(9)  ;
+		L_result += STEP(10) ; L_result += STEP(11) ;
+		L_result += STEP(12) ; L_result += STEP(13) ;
+		L_result += STEP(14) ; L_result += STEP(15) ;
+		L_result += STEP(16) ; L_result += STEP(17) ;
+		L_result += STEP(18) ; L_result += STEP(19) ;
+		L_result += STEP(20) ; L_result += STEP(21) ;
+		L_result += STEP(22) ; L_result += STEP(23) ;
+		L_result += STEP(24) ; L_result += STEP(25) ;
+		L_result += STEP(26) ; L_result += STEP(27) ;
+		L_result += STEP(28) ; L_result += STEP(29) ;
+		L_result += STEP(30) ; L_result += STEP(31) ;
+		L_result += STEP(32) ; L_result += STEP(33) ;
+		L_result += STEP(34) ; L_result += STEP(35) ;
+		L_result += STEP(36) ; L_result += STEP(37) ;
+		L_result += STEP(38) ; L_result += STEP(39) ;
+
+		if (L_result > L_max) {
+
+			Nc    = lambda;
+			L_max = L_result;
+		}
+	}
+
+	*Nc_out = Nc;
+
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >=  -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#else	/* USE_FLOAT_MUL */
+
+#ifdef	LTP_CUT
+
+static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out),
+	struct gsm_state * st,		/*              IN 	*/
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+	word		ltp_cut;
+
+	float		wt_float[40];
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	longword	L_max, L_power;
+	word		R, S, dmax, scal;
+	register word	temp;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) dmax = temp;
+	}
+
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+
+	assert(scal >= 0);
+	ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100; 
+
+
+	/*  Initialization of a working array wt
+	 */
+
+	for (k = 0; k < 40; k++) {
+		register word w = SASR( d[k], scal );
+		if (w < 0 ? w > -ltp_cut : w < ltp_cut) {
+			wt_float[k] = 0.0;
+		}
+		else {
+			wt_float[k] =  w;
+		}
+	}
+	for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda += 9) {
+
+		/*  Calculate L_result for l = lambda .. lambda + 9.
+		 */
+		register float *lp = dp_float - lambda;
+
+		register float	W;
+		register float	a = lp[-8], b = lp[-7], c = lp[-6],
+				d = lp[-5], e = lp[-4], f = lp[-3],
+				g = lp[-2], h = lp[-1];
+		register float  E; 
+		register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+				S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#		undef STEP
+#		define	STEP(K, a, b, c, d, e, f, g, h) \
+			if ((W = wt_float[K]) != 0.0) {	\
+			E = W * a; S8 += E;		\
+			E = W * b; S7 += E;		\
+			E = W * c; S6 += E;		\
+			E = W * d; S5 += E;		\
+			E = W * e; S4 += E;		\
+			E = W * f; S3 += E;		\
+			E = W * g; S2 += E;		\
+			E = W * h; S1 += E;		\
+			a  = lp[K];			\
+			E = W * a; S0 += E; } else (a = lp[K])
+
+#		define	STEP_A(K)	STEP(K, a, b, c, d, e, f, g, h)
+#		define	STEP_B(K)	STEP(K, b, c, d, e, f, g, h, a)
+#		define	STEP_C(K)	STEP(K, c, d, e, f, g, h, a, b)
+#		define	STEP_D(K)	STEP(K, d, e, f, g, h, a, b, c)
+#		define	STEP_E(K)	STEP(K, e, f, g, h, a, b, c, d)
+#		define	STEP_F(K)	STEP(K, f, g, h, a, b, c, d, e)
+#		define	STEP_G(K)	STEP(K, g, h, a, b, c, d, e, f)
+#		define	STEP_H(K)	STEP(K, h, a, b, c, d, e, f, g)
+
+		STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+		STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+		STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+		STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+		STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+		STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+		STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+		STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+		STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+		STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+		if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+		if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+		if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+		if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+		if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+		if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+		if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+		if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+		if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+
+	}
+	*Nc_out = Nc;
+
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >=  -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+
+	float		wt_float[40];
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	longword	L_max, L_power;
+	word		R, S, dmax, scal;
+	register word	temp;
+
+	/*  Search of the optimum scaling of d[0..39].
+	 */
+	dmax = 0;
+
+	for (k = 0; k <= 39; k++) {
+		temp = d[k];
+		temp = GSM_ABS( temp );
+		if (temp > dmax) dmax = temp;
+	}
+
+	temp = 0;
+	if (dmax == 0) scal = 0;
+	else {
+		assert(dmax > 0);
+		temp = gsm_norm( (longword)dmax << 16 );
+	}
+
+	if (temp > 6) scal = 0;
+	else scal = 6 - temp;
+
+	assert(scal >= 0);
+
+	/*  Initialization of a working array wt
+	 */
+
+	for (k =    0; k < 40; k++) wt_float[k] =  SASR( d[k], scal );
+	for (k = -120; k <  0; k++) dp_float[k] =  dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda += 9) {
+
+		/*  Calculate L_result for l = lambda .. lambda + 9.
+		 */
+		register float *lp = dp_float - lambda;
+
+		register float	W;
+		register float	a = lp[-8], b = lp[-7], c = lp[-6],
+				d = lp[-5], e = lp[-4], f = lp[-3],
+				g = lp[-2], h = lp[-1];
+		register float  E; 
+		register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+				S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#		undef STEP
+#		define	STEP(K, a, b, c, d, e, f, g, h) \
+			W = wt_float[K];		\
+			E = W * a; S8 += E;		\
+			E = W * b; S7 += E;		\
+			E = W * c; S6 += E;		\
+			E = W * d; S5 += E;		\
+			E = W * e; S4 += E;		\
+			E = W * f; S3 += E;		\
+			E = W * g; S2 += E;		\
+			E = W * h; S1 += E;		\
+			a  = lp[K];			\
+			E = W * a; S0 += E
+
+#		define	STEP_A(K)	STEP(K, a, b, c, d, e, f, g, h)
+#		define	STEP_B(K)	STEP(K, b, c, d, e, f, g, h, a)
+#		define	STEP_C(K)	STEP(K, c, d, e, f, g, h, a, b)
+#		define	STEP_D(K)	STEP(K, d, e, f, g, h, a, b, c)
+#		define	STEP_E(K)	STEP(K, e, f, g, h, a, b, c, d)
+#		define	STEP_F(K)	STEP(K, f, g, h, a, b, c, d, e)
+#		define	STEP_G(K)	STEP(K, g, h, a, b, c, d, e, f)
+#		define	STEP_H(K)	STEP(K, h, a, b, c, d, e, f, g)
+
+		STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+		STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+		STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+		STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+		STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+		STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+		STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+		STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+		STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+		STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+		if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+		if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+		if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+		if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+		if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+		if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+		if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+		if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+		if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+	}
+	*Nc_out = Nc;
+
+	L_max <<= 1;
+
+	/*  Rescaling of L_max
+	 */
+	assert(scal <= 100 && scal >=  -100);
+	L_max = L_max >> (6 - scal);	/* sub(6, scal) */
+
+	assert( Nc <= 120 && Nc >= 40);
+
+	/*   Compute the power of the reconstructed short term residual
+	 *   signal dp[..]
+	 */
+	L_power = 0;
+	for (k = 0; k <= 39; k++) {
+
+		register longword L_temp;
+
+		L_temp   = SASR( dp[k - Nc], 3 );
+		L_power += L_temp * L_temp;
+	}
+	L_power <<= 1;	/* from L_MULT */
+
+	/*  Normalization of L_max and L_power
+	 */
+
+	if (L_max <= 0)  {
+		*bc_out = 0;
+		return;
+	}
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	temp = gsm_norm( L_power );
+
+	R = SASR( L_max   << temp, 16 );
+	S = SASR( L_power << temp, 16 );
+
+	/*  Coding of the LTP gain
+	 */
+
+	/*  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break;
+	*bc_out = bc;
+}
+
+#ifdef	FAST
+#ifdef	LTP_CUT
+
+static void Cut_Fast_Calculation_of_the_LTP_parameters P5((st,
+							d,dp,bc_out,Nc_out),
+	struct gsm_state * st,		/*              IN	*/
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	register float	wt_float;
+	word		Nc, bc;
+	word		wt_max, best_k, ltp_cut;
+
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	register float	L_result, L_max, L_power;
+
+	wt_max = 0;
+
+	for (k = 0; k < 40; ++k) {
+		if      ( d[k] > wt_max) wt_max =  d[best_k = k];
+		else if (-d[k] > wt_max) wt_max = -d[best_k = k];
+	}
+
+	assert(wt_max >= 0);
+	wt_float = (float)wt_max;
+
+	for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda++) {
+		L_result = wt_float * dp_float[best_k - lambda];
+		if (L_result > L_max) {
+			Nc    = lambda;
+			L_max = L_result;
+		}
+	}
+
+	*Nc_out = Nc;
+	if (L_max <= 0.)  {
+		*bc_out = 0;
+		return;
+	}
+
+	/*  Compute the power of the reconstructed short term residual
+	 *  signal dp[..]
+	 */
+	dp_float -= Nc;
+	L_power = 0;
+	for (k = 0; k < 40; ++k) {
+		register float f = dp_float[k];
+		L_power += f * f;
+	}
+
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	/*  Coding of the LTP gain
+	 *  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	lambda = L_max / L_power * 32768.;
+	for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+	*bc_out = bc;
+}
+
+#endif /* LTP_CUT */
+
+static void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out),
+	register word	* d,		/* [0..39]	IN	*/
+	register word	* dp,		/* [-120..-1]	IN	*/
+	word		* bc_out,	/* 		OUT	*/
+	word		* Nc_out	/* 		OUT	*/
+)
+{
+	register int  	k, lambda;
+	word		Nc, bc;
+
+	float		wt_float[40];
+	float		dp_float_base[120], * dp_float = dp_float_base + 120;
+
+	register float	L_max, L_power;
+
+	for (k = 0; k < 40; ++k) wt_float[k] = (float)d[k];
+	for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k];
+
+	/* Search for the maximum cross-correlation and coding of the LTP lag
+	 */
+	L_max = 0;
+	Nc    = 40;	/* index for the maximum cross-correlation */
+
+	for (lambda = 40; lambda <= 120; lambda += 9) {
+
+		/*  Calculate L_result for l = lambda .. lambda + 9.
+		 */
+		register float *lp = dp_float - lambda;
+
+		register float	W;
+		register float	a = lp[-8], b = lp[-7], c = lp[-6],
+				d = lp[-5], e = lp[-4], f = lp[-3],
+				g = lp[-2], h = lp[-1];
+		register float  E; 
+		register float  S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0,
+				S5 = 0, S6 = 0, S7 = 0, S8 = 0;
+
+#		undef STEP
+#		define	STEP(K, a, b, c, d, e, f, g, h) \
+			W = wt_float[K];		\
+			E = W * a; S8 += E;		\
+			E = W * b; S7 += E;		\
+			E = W * c; S6 += E;		\
+			E = W * d; S5 += E;		\
+			E = W * e; S4 += E;		\
+			E = W * f; S3 += E;		\
+			E = W * g; S2 += E;		\
+			E = W * h; S1 += E;		\
+			a  = lp[K];			\
+			E = W * a; S0 += E
+
+#		define	STEP_A(K)	STEP(K, a, b, c, d, e, f, g, h)
+#		define	STEP_B(K)	STEP(K, b, c, d, e, f, g, h, a)
+#		define	STEP_C(K)	STEP(K, c, d, e, f, g, h, a, b)
+#		define	STEP_D(K)	STEP(K, d, e, f, g, h, a, b, c)
+#		define	STEP_E(K)	STEP(K, e, f, g, h, a, b, c, d)
+#		define	STEP_F(K)	STEP(K, f, g, h, a, b, c, d, e)
+#		define	STEP_G(K)	STEP(K, g, h, a, b, c, d, e, f)
+#		define	STEP_H(K)	STEP(K, h, a, b, c, d, e, f, g)
+
+		STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3);
+		STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7);
+
+		STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11);
+		STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15);
+
+		STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19);
+		STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23);
+
+		STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27);
+		STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31);
+
+		STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35);
+		STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39);
+
+		if (S0 > L_max) { L_max = S0; Nc = lambda;     }
+		if (S1 > L_max) { L_max = S1; Nc = lambda + 1; }
+		if (S2 > L_max) { L_max = S2; Nc = lambda + 2; }
+		if (S3 > L_max) { L_max = S3; Nc = lambda + 3; }
+		if (S4 > L_max) { L_max = S4; Nc = lambda + 4; }
+		if (S5 > L_max) { L_max = S5; Nc = lambda + 5; }
+		if (S6 > L_max) { L_max = S6; Nc = lambda + 6; }
+		if (S7 > L_max) { L_max = S7; Nc = lambda + 7; }
+		if (S8 > L_max) { L_max = S8; Nc = lambda + 8; }
+	}
+	*Nc_out = Nc;
+
+	if (L_max <= 0.)  {
+		*bc_out = 0;
+		return;
+	}
+
+	/*  Compute the power of the reconstructed short term residual
+	 *  signal dp[..]
+	 */
+	dp_float -= Nc;
+	L_power = 0;
+	for (k = 0; k < 40; ++k) {
+		register float f = dp_float[k];
+		L_power += f * f;
+	}
+
+	if (L_max >= L_power) {
+		*bc_out = 3;
+		return;
+	}
+
+	/*  Coding of the LTP gain
+	 *  Table 4.3a must be used to obtain the level DLB[i] for the
+	 *  quantization of the LTP gain b to get the coded version bc.
+	 */
+	lambda = L_max / L_power * 32768.;
+	for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break;
+	*bc_out = bc;
+}
+
+#endif	/* FAST 	 */
+#endif	/* USE_FLOAT_MUL */
+
+
+/* 4.2.12 */
+
+static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e),
+	word		bc,	/* 					IN  */
+	word		Nc,	/* 					IN  */
+	register word	* dp,	/* previous d	[-120..-1]		IN  */
+	register word	* d,	/* d		[0..39]			IN  */
+	register word	* dpp,	/* estimate	[0..39]			OUT */
+	register word	* e	/* long term res. signal [0..39]	OUT */
+)
+/*
+ *  In this part, we have to decode the bc parameter to compute
+ *  the samples of the estimate dpp[0..39].  The decoding of bc needs the
+ *  use of table 4.3b.  The long term residual signal e[0..39]
+ *  is then calculated to be fed to the RPE encoding section.
+ */
+{
+	register int      k;
+	register longword ltmp;
+
+#	undef STEP
+#	define STEP(BP)					\
+	for (k = 0; k <= 39; k++) {			\
+		dpp[k]  = GSM_MULT_R( BP, dp[k - Nc]);	\
+		e[k]	= GSM_SUB( d[k], dpp[k] );	\
+	}
+
+	switch (bc) {
+	case 0:	STEP(  3277 ); break;
+	case 1:	STEP( 11469 ); break;
+	case 2: STEP( 21299 ); break;
+	case 3: STEP( 32767 ); break; 
+	}
+}
+
+void Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc), 	/* 4x for 160 samples */
+
+	struct gsm_state	* S,
+
+	word	* d,	/* [0..39]   residual signal	IN	*/
+	word	* dp,	/* [-120..-1] d'		IN	*/
+
+	word	* e,	/* [0..39] 			OUT	*/
+	word	* dpp,	/* [0..39] 			OUT	*/
+	word	* Nc,	/* correlation lag		OUT	*/
+	word	* bc	/* gain factor			OUT	*/
+)
+{
+	assert( d  ); assert( dp ); assert( e  );
+	assert( dpp); assert( Nc ); assert( bc );
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+	if (S->fast) 
+#if   defined (LTP_CUT)
+		if (S->ltp_cut)
+			Cut_Fast_Calculation_of_the_LTP_parameters(S,
+				d, dp, bc, Nc);
+		else
+#endif /* LTP_CUT */
+			Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc );
+	else 
+#endif /* FAST & USE_FLOAT_MUL */
+#ifdef LTP_CUT
+		if (S->ltp_cut)
+			Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc);
+		else
+#endif
+			Calculation_of_the_LTP_parameters(d, dp, bc, Nc);
+
+	Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e );
+}
+
+/* 4.3.2 */
+void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp),
+	struct gsm_state	* S,
+
+	word			Ncr,
+	word			bcr,
+	register word		* erp,	   /* [0..39]		  	 IN */
+	register word		* drp	   /* [-120..-1] IN, [-120..40] OUT */
+)
+/*
+ *  This procedure uses the bcr and Ncr parameter to realize the
+ *  long term synthesis filtering.  The decoding of bcr needs
+ *  table 4.3b.
+ */
+{
+	register longword	ltmp;	/* for ADD */
+	register int 		k;
+	word			brp, drpp, Nr;
+
+	/*  Check the limits of Nr.
+	 */
+	Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr;
+	S->nrp = Nr;
+	assert(Nr >= 40 && Nr <= 120);
+
+	/*  Decoding of the LTP gain bcr
+	 */
+	brp = gsm_QLB[ bcr ];
+
+	/*  Computation of the reconstructed short term residual 
+	 *  signal drp[0..39]
+	 */
+	assert(brp != MIN_WORD);
+
+	for (k = 0; k <= 39; k++) {
+		drpp   = GSM_MULT_R( brp, drp[ k - Nr ] );
+		drp[k] = GSM_ADD( erp[k], drpp );
+	}
+
+	/*
+	 *  Update of the reconstructed short term residual signal
+	 *  drp[ -1..-120 ]
+	 */
+
+	for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ];
+}
diff --git a/gsm/lpc.c b/gsm/lpc.c
new file mode 100644
index 0000000000..ac2b8a9eb0
--- /dev/null
+++ b/gsm/lpc.c
@@ -0,0 +1,341 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+#undef	P
+
+/*
+ *  4.2.4 .. 4.2.7 LPC ANALYSIS SECTION
+ */
+
+/* 4.2.4 */
+
+
+static void Autocorrelation P2((s, L_ACF),
+	word     * s,		/* [0..159]	IN/OUT  */
+ 	longword * L_ACF)	/* [0..8]	OUT     */
+/*
+ *  The goal is to compute the array L_ACF[k].  The signal s[i] must
+ *  be scaled in order to avoid an overflow situation.
+ */
+{
+	register int	k, i;
+
+	word		temp, smax, scalauto;
+
+#ifdef	USE_FLOAT_MUL
+	float		float_s[160];
+#endif
+
+	/*  Dynamic scaling of the array  s[0..159]
+	 */
+
+	/*  Search for the maximum.
+	 */
+	smax = 0;
+	for (k = 0; k <= 159; k++) {
+		temp = GSM_ABS( s[k] );
+		if (temp > smax) smax = temp;
+	}
+
+	/*  Computation of the scaling factor.
+	 */
+	if (smax == 0) scalauto = 0;
+	else {
+		assert(smax > 0);
+		scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */
+	}
+
+	/*  Scaling of the array s[0...159]
+	 */
+
+	if (scalauto > 0) {
+
+# ifdef USE_FLOAT_MUL
+#   define SCALE(n)	\
+	case n: for (k = 0; k <= 159; k++) \
+			float_s[k] = (float)	\
+				(s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\
+		break;
+# else 
+#   define SCALE(n)	\
+	case n: for (k = 0; k <= 159; k++) \
+			s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\
+		break;
+# endif /* USE_FLOAT_MUL */
+
+		switch (scalauto) {
+		SCALE(1)
+		SCALE(2)
+		SCALE(3)
+		SCALE(4)
+		}
+# undef	SCALE
+	}
+# ifdef	USE_FLOAT_MUL
+	else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k];
+# endif
+
+	/*  Compute the L_ACF[..].
+	 */
+	{
+# ifdef	USE_FLOAT_MUL
+		register float * sp = float_s;
+		register float   sl = *sp;
+
+#		define STEP(k)	 L_ACF[k] += (longword)(sl * sp[ -(k) ]);
+# else
+		word  * sp = s;
+		word    sl = *sp;
+
+#		define STEP(k)	 L_ACF[k] += ((longword)sl * sp[ -(k) ]);
+# endif
+
+#	define NEXTI	 sl = *++sp
+
+
+	for (k = 9; k--; L_ACF[k] = 0) ;
+
+	STEP (0);
+	NEXTI;
+	STEP(0); STEP(1);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6);
+	NEXTI;
+	STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7);
+
+	for (i = 8; i <= 159; i++) {
+
+		NEXTI;
+
+		STEP(0);
+		STEP(1); STEP(2); STEP(3); STEP(4);
+		STEP(5); STEP(6); STEP(7); STEP(8);
+	}
+
+	for (k = 9; k--; L_ACF[k] <<= 1) ; 
+
+	}
+	/*   Rescaling of the array s[0..159]
+	 */
+	if (scalauto > 0) {
+		assert(scalauto <= 4); 
+		for (k = 160; k--; *s++ <<= scalauto) ;
+	}
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Autocorrelation P2((s, L_ACF),
+	word * s,		/* [0..159]	IN/OUT  */
+ 	longword * L_ACF)	/* [0..8]	OUT     */
+{
+	register int	k, i;
+	float f_L_ACF[9];
+	float scale;
+
+	float          s_f[160];
+	register float *sf = s_f;
+
+	for (i = 0; i < 160; ++i) sf[i] = s[i];
+	for (k = 0; k <= 8; k++) {
+		register float L_temp2 = 0;
+		register float *sfl = sf - k;
+		for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i];
+		f_L_ACF[k] = L_temp2;
+	}
+	scale = MAX_LONGWORD / f_L_ACF[0];
+
+	for (k = 0; k <= 8; k++) {
+		L_ACF[k] = f_L_ACF[k] * scale;
+	}
+}
+#endif	/* defined (USE_FLOAT_MUL) && defined (FAST) */
+
+/* 4.2.5 */
+
+static void Reflection_coefficients P2( (L_ACF, r),
+	longword	* L_ACF,		/* 0...8	IN	*/
+	register word	* r			/* 0...7	OUT 	*/
+)
+{
+	register int	i, m, n;
+	register word	temp;
+	register longword ltmp;
+	word		ACF[9];	/* 0..8 */
+	word		P[  9];	/* 0..8 */
+	word		K[  9]; /* 2..8 */
+
+	/*  Schur recursion with 16 bits arithmetic.
+	 */
+
+	if (L_ACF[0] == 0) {
+		for (i = 8; i--; *r++ = 0) ;
+		return;
+	}
+
+	assert( L_ACF[0] != 0 );
+	temp = gsm_norm( L_ACF[0] );
+
+	assert(temp >= 0 && temp < 32);
+
+	/* ? overflow ? */
+	for (i = 0; i <= 8; i++) ACF[i] = SASR( L_ACF[i] << temp, 16 );
+
+	/*   Initialize array P[..] and K[..] for the recursion.
+	 */
+
+	for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ];
+	for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ];
+
+	/*   Compute reflection coefficients
+	 */
+	for (n = 1; n <= 8; n++, r++) {
+
+		temp = P[1];
+		temp = GSM_ABS(temp);
+		if (P[0] < temp) {
+			for (i = n; i <= 8; i++) *r++ = 0;
+			return;
+		}
+
+		*r = gsm_div( temp, P[0] );
+
+		assert(*r >= 0);
+		if (P[1] > 0) *r = -*r;		/* r[n] = sub(0, r[n]) */
+		assert (*r != MIN_WORD);
+		if (n == 8) return; 
+
+		/*  Schur recursion
+		 */
+		temp = GSM_MULT_R( P[1], *r );
+		P[0] = GSM_ADD( P[0], temp );
+
+		for (m = 1; m <= 8 - n; m++) {
+			temp     = GSM_MULT_R( K[ m   ],    *r );
+			P[m]     = GSM_ADD(    P[ m+1 ],  temp );
+
+			temp     = GSM_MULT_R( P[ m+1 ],    *r );
+			K[m]     = GSM_ADD(    K[ m   ],  temp );
+		}
+	}
+}
+
+/* 4.2.6 */
+
+static void Transformation_to_Log_Area_Ratios P1((r),
+	register word	* r 			/* 0..7	   IN/OUT */
+)
+/*
+ *  The following scaling for r[..] and LAR[..] has been used:
+ *
+ *  r[..]   = integer( real_r[..]*32768. ); -1 <= real_r < 1.
+ *  LAR[..] = integer( real_LAR[..] * 16384 );
+ *  with -1.625 <= real_LAR <= 1.625
+ */
+{
+	register word	temp;
+	register int	i;
+
+
+	/* Computation of the LAR[0..7] from the r[0..7]
+	 */
+	for (i = 1; i <= 8; i++, r++) {
+
+		temp = *r;
+		temp = GSM_ABS(temp);
+		assert(temp >= 0);
+
+		if (temp < 22118) {
+			temp >>= 1;
+		} else if (temp < 31130) {
+			assert( temp >= 11059 );
+			temp -= 11059;
+		} else {
+			assert( temp >= 26112 );
+			temp -= 26112;
+			temp <<= 2;
+		}
+
+		*r = *r < 0 ? -temp : temp;
+		assert( *r != MIN_WORD );
+	}
+}
+
+/* 4.2.7 */
+
+static void Quantization_and_coding P1((LAR),
+	register word * LAR    	/* [0..7]	IN/OUT	*/
+)
+{
+	register word	temp;
+	longword	ltmp;
+
+
+	/*  This procedure needs four tables; the following equations
+	 *  give the optimum scaling for the constants:
+	 *  
+	 *  A[0..7] = integer( real_A[0..7] * 1024 )
+	 *  B[0..7] = integer( real_B[0..7] *  512 )
+	 *  MAC[0..7] = maximum of the LARc[0..7]
+	 *  MIC[0..7] = minimum of the LARc[0..7]
+	 */
+
+#	undef STEP
+#	define	STEP( A, B, MAC, MIC )		\
+		temp = GSM_MULT( A,   *LAR );	\
+		temp = GSM_ADD(  temp,   B );	\
+		temp = GSM_ADD(  temp, 256 );	\
+		temp = SASR(     temp,   9 );	\
+		*LAR  =  temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \
+		LAR++;
+
+	STEP(  20480,     0,  31, -32 );
+	STEP(  20480,     0,  31, -32 );
+	STEP(  20480,  2048,  15, -16 );
+	STEP(  20480, -2560,  15, -16 );
+
+	STEP(  13964,    94,   7,  -8 );
+	STEP(  15360, -1792,   7,  -8 );
+	STEP(   8534,  -341,   3,  -4 );
+	STEP(   9036, -1144,   3,  -4 );
+
+#	undef	STEP
+}
+
+void Gsm_LPC_Analysis P3((S, s,LARc),
+	struct gsm_state *S,
+	word 		 * s,		/* 0..159 signals	IN/OUT	*/
+        word 		 * LARc)	/* 0..7   LARc's	OUT	*/
+{
+	longword	L_ACF[9];
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+	if (S->fast) Fast_Autocorrelation (s,	  L_ACF );
+	else
+#endif
+	Autocorrelation			  (s,	  L_ACF	);
+	Reflection_coefficients		  (L_ACF, LARc	);
+	Transformation_to_Log_Area_Ratios (LARc);
+	Quantization_and_coding		  (LARc);
+}
diff --git a/gsm/preprocess.c b/gsm/preprocess.c
new file mode 100644
index 0000000000..99c0709dcf
--- /dev/null
+++ b/gsm/preprocess.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include	<stdio.h>
+#include	<assert.h>
+
+#include "private.h"
+
+#include	"gsm.h"
+#include 	"proto.h"
+
+/*	4.2.0 .. 4.2.3	PREPROCESSING SECTION
+ *  
+ *  	After A-law to linear conversion (or directly from the
+ *   	Ato D converter) the following scaling is assumed for
+ * 	input to the RPE-LTP algorithm:
+ *
+ *      in:  0.1.....................12
+ *	     S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.*
+ *
+ *	Where S is the sign bit, v a valid bit, and * a "don't care" bit.
+ * 	The original signal is called sop[..]
+ *
+ *      out:   0.1................... 12 
+ *	     S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0
+ */
+
+
+void Gsm_Preprocess P3((S, s, so),
+	struct gsm_state * S,
+	word		 * s,
+	word 		 * so )		/* [0..159] 	IN/OUT	*/
+{
+
+	word       z1 = S->z1;
+	longword L_z2 = S->L_z2;
+	word 	   mp = S->mp;
+
+	word 	   	s1;
+	longword      L_s2;
+
+	longword      L_temp;
+
+	word		msp, lsp;
+	word		SO;
+
+	longword	ltmp;		/* for   ADD */
+	ulongword	utmp;		/* for L_ADD */
+
+	register int		k = 160;
+
+	while (k--) {
+
+	/*  4.2.1   Downscaling of the input signal
+	 */
+		SO = SASR( *s, 3 ) << 2;
+		s++;
+
+		assert (SO >= -0x4000);	/* downscaled by     */
+		assert (SO <=  0x3FFC);	/* previous routine. */
+
+
+	/*  4.2.2   Offset compensation
+	 * 
+	 *  This part implements a high-pass filter and requires extended
+	 *  arithmetic precision for the recursive part of this filter.
+	 *  The input of this procedure is the array so[0...159] and the
+	 *  output the array sof[ 0...159 ].
+	 */
+		/*   Compute the non-recursive part
+		 */
+
+		s1 = SO - z1;			/* s1 = gsm_sub( *so, z1 ); */
+		z1 = SO;
+
+		assert(s1 != MIN_WORD);
+
+		/*   Compute the recursive part
+		 */
+		L_s2 = s1;
+		L_s2 <<= 15;
+
+		/*   Execution of a 31 bv 16 bits multiplication
+		 */
+
+		msp = SASR( L_z2, 15 );
+		lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */
+
+		L_s2  += GSM_MULT_R( lsp, 32735 );
+		L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/
+		L_z2   = GSM_L_ADD( L_temp, L_s2 );
+
+		/*    Compute sof[k] with rounding
+		 */
+		L_temp = GSM_L_ADD( L_z2, 16384 );
+
+	/*   4.2.3  Preemphasis
+	 */
+
+		msp   = GSM_MULT_R( mp, -28180 );
+		mp    = SASR( L_temp, 15 );
+		*so++ = GSM_ADD( mp, msp );
+	}
+
+	S->z1   = z1;
+	S->L_z2 = L_z2;
+	S->mp   = mp;
+}
diff --git a/gsm/private.h b/gsm/private.h
new file mode 100644
index 0000000000..6b538cc27a
--- /dev/null
+++ b/gsm/private.h
@@ -0,0 +1,268 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header$*/
+
+#ifndef	PRIVATE_H
+#define	PRIVATE_H
+
+typedef short			word;		/* 16 bit signed int	*/
+typedef long			longword;	/* 32 bit signed int	*/
+
+typedef unsigned short		uword;		/* unsigned word	*/
+typedef unsigned long		ulongword;	/* unsigned longword	*/
+
+struct gsm_state {
+
+	word		dp0[ 280 ];
+
+	word		z1;		/* preprocessing.c, Offset_com. */
+	longword	L_z2;		/*                  Offset_com. */
+	int		mp;		/*                  Preemphasis	*/
+
+	word		u[8];		/* short_term_aly_filter.c	*/
+	word		LARpp[2][8]; 	/*                              */
+	word		j;		/*                              */
+
+	word            ltp_cut;        /* long_term.c, LTP crosscorr.  */
+	word		nrp; /* 40 */	/* long_term.c, synthesis	*/
+	word		v[9];		/* short_term.c, synthesis	*/
+	word		msr;		/* decoder.c,	Postprocessing	*/
+
+	char		verbose;	/* only used if !NDEBUG		*/
+	char		fast;		/* only used if FAST		*/
+
+	char		wav_fmt;	/* only used if WAV49 defined	*/
+	unsigned char	frame_index;	/*            odd/even chaining	*/
+	unsigned char	frame_chain;	/*   half-byte to carry forward	*/
+};
+
+
+#define	MIN_WORD	(-32767 - 1)
+#define	MAX_WORD	  32767
+
+#define	MIN_LONGWORD	(-2147483647 - 1)
+#define	MAX_LONGWORD	  2147483647
+
+#ifdef	SASR		/* flag: >> is a signed arithmetic shift right */
+#undef	SASR
+#define	SASR(x, by)	((x) >> (by))
+#else
+#define	SASR(x, by)	((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by))))
+#endif	/* SASR */
+
+#include "proto.h"
+
+/*
+ *	Prototypes from add.c
+ */
+extern word	gsm_mult 	P((word a, word b));
+extern longword gsm_L_mult 	P((word a, word b));
+extern word	gsm_mult_r	P((word a, word b));
+
+extern word	gsm_div  	P((word num, word denum));
+
+extern word	gsm_add 	P(( word a, word b ));
+extern longword gsm_L_add 	P(( longword a, longword b ));
+
+extern word	gsm_sub 	P((word a, word b));
+extern longword gsm_L_sub 	P((longword a, longword b));
+
+extern word	gsm_abs 	P((word a));
+
+extern word	gsm_norm 	P(( longword a ));
+
+extern longword gsm_L_asl  	P((longword a, int n));
+extern word	gsm_asl 	P((word a, int n));
+
+extern longword gsm_L_asr  	P((longword a, int n));
+extern word	gsm_asr  	P((word a, int n));
+
+/*
+ *  Inlined functions from add.h 
+ */
+
+/* 
+ * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *)	\
+ *	(0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15))
+ */
+#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */	\
+	(SASR( ((longword)(a) * (longword)(b) + 16384), 15 ))
+
+# define GSM_MULT(a,b)	 /* word a, word b, !(a == b == MIN_WORD) */	\
+	(SASR( ((longword)(a) * (longword)(b)), 15 ))
+
+# define GSM_L_MULT(a, b) /* word a, word b */	\
+	(((longword)(a) * (longword)(b)) << 1)
+
+# define GSM_L_ADD(a, b)	\
+	( (a) <  0 ? ( (b) >= 0 ? (a) + (b)	\
+		 : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \
+		   >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 )   \
+	: ((b) <= 0 ? (a) + (b)   \
+	          : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \
+		    ? MAX_LONGWORD : utmp))
+
+/*
+ * # define GSM_ADD(a, b)	\
+ * 	((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \
+ * 	? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)
+ */
+/* Nonportable, but faster: */
+
+#define	GSM_ADD(a, b)	\
+	((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \
+		MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp)
+
+# define GSM_SUB(a, b)	\
+	((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \
+	? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp)
+
+# define GSM_ABS(a)	((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a))
+
+/* Use these if necessary:
+
+# define GSM_MULT_R(a, b)	gsm_mult_r(a, b)
+# define GSM_MULT(a, b)		gsm_mult(a, b)
+# define GSM_L_MULT(a, b)	gsm_L_mult(a, b)
+
+# define GSM_L_ADD(a, b)	gsm_L_add(a, b)
+# define GSM_ADD(a, b)		gsm_add(a, b)
+# define GSM_SUB(a, b)		gsm_sub(a, b)
+
+# define GSM_ABS(a)		gsm_abs(a)
+
+*/
+
+/*
+ *  More prototypes from implementations..
+ */
+extern void Gsm_Coder P((
+		struct gsm_state	* S,
+		word	* s,	/* [0..159] samples		IN	*/
+		word	* LARc,	/* [0..7] LAR coefficients	OUT	*/
+		word	* Nc,	/* [0..3] LTP lag		OUT 	*/
+		word	* bc,	/* [0..3] coded LTP gain	OUT 	*/
+		word	* Mc,	/* [0..3] RPE grid selection	OUT     */
+		word	* xmaxc,/* [0..3] Coded maximum amplitude OUT	*/
+		word	* xMc	/* [13*4] normalized RPE samples OUT	*/));
+
+extern void Gsm_Long_Term_Predictor P((		/* 4x for 160 samples */
+		struct gsm_state * S,
+		word	* d,	/* [0..39]   residual signal	IN	*/
+		word	* dp,	/* [-120..-1] d'		IN	*/
+		word	* e,	/* [0..40] 			OUT	*/
+		word	* dpp,	/* [0..40] 			OUT	*/
+		word	* Nc,	/* correlation lag		OUT	*/
+		word	* bc	/* gain factor			OUT	*/));
+
+extern void Gsm_LPC_Analysis P((
+		struct gsm_state * S,
+		word * s,	 /* 0..159 signals	IN/OUT	*/
+	        word * LARc));   /* 0..7   LARc's	OUT	*/
+
+extern void Gsm_Preprocess P((
+		struct gsm_state * S,
+		word * s, word * so));
+
+extern void Gsm_Encoding P((
+		struct gsm_state * S,
+		word	* e,	
+		word	* ep,	
+		word	* xmaxc,
+		word	* Mc,	
+		word	* xMc));
+
+extern void Gsm_Short_Term_Analysis_Filter P((
+		struct gsm_state * S,
+		word	* LARc,	/* coded log area ratio [0..7]  IN	*/
+		word	* d	/* st res. signal [0..159]	IN/OUT	*/));
+
+extern void Gsm_Decoder P((
+		struct gsm_state * S,
+		word	* LARcr,	/* [0..7]		IN	*/
+		word	* Ncr,		/* [0..3] 		IN 	*/
+		word	* bcr,		/* [0..3]		IN	*/
+		word	* Mcr,		/* [0..3] 		IN 	*/
+		word	* xmaxcr,	/* [0..3]		IN 	*/
+		word	* xMcr,		/* [0..13*4]		IN	*/
+		word	* s));		/* [0..159]		OUT 	*/
+
+extern void Gsm_Decoding P((
+		struct gsm_state * S,
+		word 	xmaxcr,
+		word	Mcr,
+		word	* xMcr,  	/* [0..12]		IN	*/
+		word	* erp)); 	/* [0..39]		OUT 	*/
+
+extern void Gsm_Long_Term_Synthesis_Filtering P((
+		struct gsm_state* S,
+		word	Ncr,
+		word	bcr,
+		word	* erp,		/* [0..39]		  IN 	*/
+		word	* drp)); 	/* [-120..-1] IN, [0..40] OUT 	*/
+
+void Gsm_RPE_Decoding P((
+	struct gsm_state *S,
+		word xmaxcr,
+		word Mcr,
+		word * xMcr,  /* [0..12], 3 bits             IN      */
+		word * erp)); /* [0..39]                     OUT     */
+
+void Gsm_RPE_Encoding P((
+		struct gsm_state * S,
+		word    * e,            /* -5..-1][0..39][40..44     IN/OUT  */
+		word    * xmaxc,        /*                              OUT */
+		word    * Mc,           /*                              OUT */
+		word    * xMc));        /* [0..12]                      OUT */
+
+extern void Gsm_Short_Term_Synthesis_Filter P((
+		struct gsm_state * S,
+		word	* LARcr, 	/* log area ratios [0..7]  IN	*/
+		word	* drp,		/* received d [0...39]	   IN	*/
+		word	* s));		/* signal   s [0..159]	  OUT	*/
+
+extern void Gsm_Update_of_reconstructed_short_time_residual_signal P((
+		word	* dpp,		/* [0...39]	IN	*/
+		word	* ep,		/* [0...39]	IN	*/
+		word	* dp));		/* [-120...-1]  IN/OUT 	*/
+
+/*
+ *  Tables from table.c
+ */
+#ifndef	GSM_TABLE_C
+
+extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8];
+extern word gsm_INVA[8];
+extern word gsm_DLB[4], gsm_QLB[4];
+extern word gsm_H[11];
+extern word gsm_NRFAC[8];
+extern word gsm_FAC[8];
+
+#endif	/* GSM_TABLE_C */
+
+/*
+ *  Debugging
+ */
+#ifdef NDEBUG
+
+#	define	gsm_debug_words(a, b, c, d)		/* nil */
+#	define	gsm_debug_longwords(a, b, c, d)		/* nil */
+#	define	gsm_debug_word(a, b)			/* nil */
+#	define	gsm_debug_longword(a, b)		/* nil */
+
+#else	/* !NDEBUG => DEBUG */
+
+	extern void  gsm_debug_words     P((char * name, int, int, word *));
+	extern void  gsm_debug_longwords P((char * name, int, int, longword *));
+	extern void  gsm_debug_longword  P((char * name, longword));
+	extern void  gsm_debug_word      P((char * name, word));
+
+#endif /* !NDEBUG */
+
+#include "unproto.h"
+
+#endif	/* PRIVATE_H */
diff --git a/gsm/proto.h b/gsm/proto.h
new file mode 100644
index 0000000000..87cf05e8a7
--- /dev/null
+++ b/gsm/proto.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header$*/
+
+#ifndef	PROTO_H
+#define	PROTO_H
+
+#if __cplusplus
+#	define	NeedFunctionPrototypes	1
+#endif
+
+#if __STDC__
+#	define	NeedFunctionPrototypes	1
+#endif
+
+#ifdef	_NO_PROTO
+#	undef	NeedFunctionPrototypes
+#endif
+
+#undef	P	/* gnu stdio.h actually defines this... 	*/
+#undef	P0
+#undef	P1
+#undef	P2
+#undef	P3
+#undef	P4
+#undef	P5
+#undef	P6
+#undef	P7
+#undef	P8
+
+#if NeedFunctionPrototypes
+
+#	define	P( protos )	protos
+
+#	define	P0()				(void)
+#	define	P1(x, a)			(a)
+#	define	P2(x, a, b)			(a, b)
+#	define	P3(x, a, b, c)			(a, b, c)
+#	define	P4(x, a, b, c, d)		(a, b, c, d)	
+#	define	P5(x, a, b, c, d, e)		(a, b, c, d, e)
+#	define	P6(x, a, b, c, d, e, f)		(a, b, c, d, e, f)
+#	define	P7(x, a, b, c, d, e, f, g)	(a, b, c, d, e, f, g)
+#	define	P8(x, a, b, c, d, e, f, g, h)	(a, b, c, d, e, f, g, h)
+
+#else /* !NeedFunctionPrototypes */
+
+#	define	P( protos )	( /* protos */ )
+
+#	define	P0()				()
+#	define	P1(x, a)			x a;
+#	define	P2(x, a, b)			x a; b;
+#	define	P3(x, a, b, c)			x a; b; c;
+#	define	P4(x, a, b, c, d)		x a; b; c; d;
+#	define	P5(x, a, b, c, d, e)		x a; b; c; d; e;
+#	define	P6(x, a, b, c, d, e, f)		x a; b; c; d; e; f;
+#	define	P7(x, a, b, c, d, e, f, g)	x a; b; c; d; e; f; g;
+#	define	P8(x, a, b, c, d, e, f, g, h)	x a; b; c; d; e; f; g; h;
+
+#endif  /* !NeedFunctionPrototypes */
+
+#endif	/* PROTO_H */
diff --git a/gsm/rpe.c b/gsm/rpe.c
new file mode 100644
index 0000000000..8a6b81fae7
--- /dev/null
+++ b/gsm/rpe.c
@@ -0,0 +1,488 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+/*  4.2.13 .. 4.2.17  RPE ENCODING SECTION
+ */
+
+/* 4.2.13 */
+
+static void Weighting_filter P2((e, x),
+	register word	* e,		/* signal [-5..0.39.44]	IN  */
+	word		* x		/* signal [0..39]	OUT */
+)
+/*
+ *  The coefficients of the weighting filter are stored in a table
+ *  (see table 4.4).  The following scaling is used:
+ *
+ *	H[0..10] = integer( real_H[ 0..10] * 8192 ); 
+ */
+{
+	/* word			wt[ 50 ]; */
+
+	register longword	L_result;
+	register int		k /* , i */ ;
+
+	/*  Initialization of a temporary working array wt[0...49]
+	 */
+
+	/* for (k =  0; k <=  4; k++) wt[k] = 0;
+	 * for (k =  5; k <= 44; k++) wt[k] = *e++;
+	 * for (k = 45; k <= 49; k++) wt[k] = 0;
+	 *
+	 *  (e[-5..-1] and e[40..44] are allocated by the caller,
+	 *  are initially zero and are not written anywhere.)
+	 */
+	e -= 5;
+
+	/*  Compute the signal x[0..39]
+	 */ 
+	for (k = 0; k <= 39; k++) {
+
+		L_result = 8192 >> 1;
+
+		/* for (i = 0; i <= 10; i++) {
+		 *	L_temp   = GSM_L_MULT( wt[k+i], gsm_H[i] );
+		 *	L_result = GSM_L_ADD( L_result, L_temp );
+		 * }
+		 */
+
+#undef	STEP
+#define	STEP( i, H )	(e[ k + i ] * (longword)H)
+
+		/*  Every one of these multiplications is done twice --
+		 *  but I don't see an elegant way to optimize this. 
+		 *  Do you?
+		 */
+
+#ifdef	STUPID_COMPILER
+		L_result += STEP(	0, 	-134 ) ;
+		L_result += STEP(	1, 	-374 )  ;
+	               /* + STEP(	2, 	0    )  */
+		L_result += STEP(	3, 	2054 ) ;
+		L_result += STEP(	4, 	5741 ) ;
+		L_result += STEP(	5, 	8192 ) ;
+		L_result += STEP(	6, 	5741 ) ;
+		L_result += STEP(	7, 	2054 ) ;
+	 	       /* + STEP(	8, 	0    )  */
+		L_result += STEP(	9, 	-374 ) ;
+		L_result += STEP(	10, 	-134 ) ;
+#else
+		L_result +=
+		  STEP(	0, 	-134 ) 
+		+ STEP(	1, 	-374 ) 
+	     /* + STEP(	2, 	0    )  */
+		+ STEP(	3, 	2054 ) 
+		+ STEP(	4, 	5741 ) 
+		+ STEP(	5, 	8192 ) 
+		+ STEP(	6, 	5741 ) 
+		+ STEP(	7, 	2054 ) 
+	     /* + STEP(	8, 	0    )  */
+		+ STEP(	9, 	-374 ) 
+		+ STEP(10, 	-134 )
+		;
+#endif
+
+		/* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *)
+		 * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *)
+		 *
+		 * x[k] = SASR( L_result, 16 );
+		 */
+
+		/* 2 adds vs. >>16 => 14, minus one shift to compensate for
+		 * those we lost when replacing L_MULT by '*'.
+		 */
+
+		L_result = SASR( L_result, 13 );
+		x[k] =  (  L_result < MIN_WORD ? MIN_WORD
+			: (L_result > MAX_WORD ? MAX_WORD : L_result ));
+	}
+}
+
+/* 4.2.14 */
+
+static void RPE_grid_selection P3((x,xM,Mc_out),
+	word		* x,		/* [0..39]		IN  */ 
+	word		* xM,		/* [0..12]		OUT */
+	word		* Mc_out	/*			OUT */
+)
+/*
+ *  The signal x[0..39] is used to select the RPE grid which is
+ *  represented by Mc.
+ */
+{
+	/* register word	temp1;	*/
+	register int		/* m, */  i;
+	register longword	L_result, L_temp;
+	longword		EM;	/* xxx should be L_EM? */
+	word			Mc;
+
+	longword		L_common_0_3;
+
+	EM = 0;
+	Mc = 0;
+
+	/* for (m = 0; m <= 3; m++) {
+	 *	L_result = 0;
+	 *
+	 *
+	 *	for (i = 0; i <= 12; i++) {
+	 *
+	 *		temp1    = SASR( x[m + 3*i], 2 );
+	 *
+	 *		assert(temp1 != MIN_WORD);
+	 *
+	 *		L_temp   = GSM_L_MULT( temp1, temp1 );
+	 *		L_result = GSM_L_ADD( L_temp, L_result );
+	 *	}
+	 * 
+	 *	if (L_result > EM) {
+	 *		Mc = m;
+	 *		EM = L_result;
+	 *	}
+	 * }
+	 */
+
+#undef	STEP
+#define	STEP( m, i )		L_temp = SASR( x[m + 3 * i], 2 );	\
+				L_result += L_temp * L_temp;
+
+	/* common part of 0 and 3 */
+
+	L_result = 0;
+	STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 );
+	STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 );
+	STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12);
+	L_common_0_3 = L_result;
+
+	/* i = 0 */
+
+	STEP( 0, 0 );
+	L_result <<= 1;	/* implicit in L_MULT */
+	EM = L_result;
+
+	/* i = 1 */
+
+	L_result = 0;
+	STEP( 1, 0 );
+	STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 );
+	STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 );
+	STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12);
+	L_result <<= 1;
+	if (L_result > EM) {
+		Mc = 1;
+	 	EM = L_result;
+	}
+
+	/* i = 2 */
+
+	L_result = 0;
+	STEP( 2, 0 );
+	STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 );
+	STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 );
+	STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12);
+	L_result <<= 1;
+	if (L_result > EM) {
+		Mc = 2;
+	 	EM = L_result;
+	}
+
+	/* i = 3 */
+
+	L_result = L_common_0_3;
+	STEP( 3, 12 );
+	L_result <<= 1;
+	if (L_result > EM) {
+		Mc = 3;
+	 	EM = L_result;
+	}
+
+	/**/
+
+	/*  Down-sampling by a factor 3 to get the selected xM[0..12]
+	 *  RPE sequence.
+	 */
+	for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i];
+	*Mc_out = Mc;
+}
+
+/* 4.12.15 */
+
+static void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out),
+	word		xmaxc,		/* IN 	*/
+	word		* exp_out,	/* OUT	*/
+	word		* mant_out )	/* OUT  */
+{
+	word	exp, mant;
+
+	/* Compute exponent and mantissa of the decoded version of xmaxc
+	 */
+
+	exp = 0;
+	if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1;
+	mant = xmaxc - (exp << 3);
+
+	if (mant == 0) {
+		exp  = -4;
+		mant = 7;
+	}
+	else {
+		while (mant <= 7) {
+			mant = mant << 1 | 1;
+			exp--;
+		}
+		mant -= 8;
+	}
+
+	assert( exp  >= -4 && exp <= 6 );
+	assert( mant >= 0 && mant <= 7 );
+
+	*exp_out  = exp;
+	*mant_out = mant;
+}
+
+static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out),
+	word		* xM,		/* [0..12]		IN	*/
+
+	word		* xMc,		/* [0..12]		OUT	*/
+	word		* mant_out,	/* 			OUT	*/
+	word		* exp_out,	/*			OUT	*/
+	word		* xmaxc_out	/*			OUT	*/
+)
+{
+	int	i, itest;
+
+	word	xmax, xmaxc, temp, temp1, temp2;
+	word	exp, mant;
+
+
+	/*  Find the maximum absolute value xmax of xM[0..12].
+	 */
+
+	xmax = 0;
+	for (i = 0; i <= 12; i++) {
+		temp = xM[i];
+		temp = GSM_ABS(temp);
+		if (temp > xmax) xmax = temp;
+	}
+
+	/*  Qantizing and coding of xmax to get xmaxc.
+	 */
+
+	exp   = 0;
+	temp  = SASR( xmax, 9 );
+	itest = 0;
+
+	for (i = 0; i <= 5; i++) {
+
+		itest |= (temp <= 0);
+		temp = SASR( temp, 1 );
+
+		assert(exp <= 5);
+		if (itest == 0) exp++;		/* exp = add (exp, 1) */
+	}
+
+	assert(exp <= 6 && exp >= 0);
+	temp = exp + 5;
+
+	assert(temp <= 11 && temp >= 0);
+	xmaxc = gsm_add( SASR(xmax, temp), exp << 3 );
+
+	/*   Quantizing and coding of the xM[0..12] RPE sequence
+	 *   to get the xMc[0..12]
+	 */
+
+	APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant );
+
+	/*  This computation uses the fact that the decoded version of xmaxc
+	 *  can be calculated by using the exponent and the mantissa part of
+	 *  xmaxc (logarithmic table).
+	 *  So, this method avoids any division and uses only a scaling
+	 *  of the RPE samples by a function of the exponent.  A direct 
+	 *  multiplication by the inverse of the mantissa (NRFAC[0..7]
+	 *  found in table 4.5) gives the 3 bit coded version xMc[0..12]
+	 *  of the RPE samples.
+	 */
+
+
+	/* Direct computation of xMc[0..12] using table 4.5
+	 */
+
+	assert( exp <= 4096 && exp >= -4096);
+	assert( mant >= 0 && mant <= 7 ); 
+
+	temp1 = 6 - exp;		/* normalization by the exponent */
+	temp2 = gsm_NRFAC[ mant ];  	/* inverse mantissa 		 */
+
+	for (i = 0; i <= 12; i++) {
+
+		assert(temp1 >= 0 && temp1 < 16);
+
+		temp = xM[i] << temp1;
+		temp = GSM_MULT( temp, temp2 );
+		temp = SASR(temp, 12);
+		xMc[i] = temp + 4;		/* see note below */
+	}
+
+	/*  NOTE: This equation is used to make all the xMc[i] positive.
+	 */
+
+	*mant_out  = mant;
+	*exp_out   = exp;
+	*xmaxc_out = xmaxc;
+}
+
+/* 4.2.16 */
+
+static void APCM_inverse_quantization P4((xMc,mant,exp,xMp),
+	register word	* xMc,	/* [0..12]			IN 	*/
+	word		mant,
+	word		exp,
+	register word	* xMp)	/* [0..12]			OUT 	*/
+/* 
+ *  This part is for decoding the RPE sequence of coded xMc[0..12]
+ *  samples to obtain the xMp[0..12] array.  Table 4.6 is used to get
+ *  the mantissa of xmaxc (FAC[0..7]).
+ */
+{
+	int	i;
+	word	temp, temp1, temp2, temp3;
+	longword	ltmp;
+
+	assert( mant >= 0 && mant <= 7 ); 
+
+	temp1 = gsm_FAC[ mant ];	/* see 4.2-15 for mant */
+	temp2 = gsm_sub( 6, exp );	/* see 4.2-15 for exp  */
+	temp3 = gsm_asl( 1, gsm_sub( temp2, 1 ));
+
+	for (i = 13; i--;) {
+
+		assert( *xMc <= 7 && *xMc >= 0 ); 	/* 3 bit unsigned */
+
+		/* temp = gsm_sub( *xMc++ << 1, 7 ); */
+		temp = (*xMc++ << 1) - 7;	        /* restore sign   */
+		assert( temp <= 7 && temp >= -7 ); 	/* 4 bit signed   */
+
+		temp <<= 12;				/* 16 bit signed  */
+		temp = GSM_MULT_R( temp1, temp );
+		temp = GSM_ADD( temp, temp3 );
+		*xMp++ = gsm_asr( temp, temp2 );
+	}
+}
+
+/* 4.2.17 */
+
+static void RPE_grid_positioning P3((Mc,xMp,ep),
+	word		Mc,		/* grid position	IN	*/
+	register word	* xMp,		/* [0..12]		IN	*/
+	register word	* ep		/* [0..39]		OUT	*/
+)
+/*
+ *  This procedure computes the reconstructed long term residual signal
+ *  ep[0..39] for the LTP analysis filter.  The inputs are the Mc
+ *  which is the grid position selection and the xMp[0..12] decoded
+ *  RPE samples which are upsampled by a factor of 3 by inserting zero
+ *  values.
+ */
+{
+	int	i = 13;
+
+	assert(0 <= Mc && Mc <= 3);
+
+        switch (Mc) {
+                case 3: *ep++ = 0;
+                case 2:  do {
+                                *ep++ = 0;
+                case 1:         *ep++ = 0;
+                case 0:         *ep++ = *xMp++;
+                         } while (--i);
+        }
+        while (++Mc < 4) *ep++ = 0;
+
+	/*
+
+	int i, k;
+	for (k = 0; k <= 39; k++) ep[k] = 0;
+	for (i = 0; i <= 12; i++) {
+		ep[ Mc + (3*i) ] = xMp[i];
+	}
+	*/
+}
+
+/* 4.2.18 */
+
+/*  This procedure adds the reconstructed long term residual signal
+ *  ep[0..39] to the estimated signal dpp[0..39] from the long term
+ *  analysis filter to compute the reconstructed short term residual
+ *  signal dp[-40..-1]; also the reconstructed short term residual
+ *  array dp[-120..-41] is updated.
+ */
+
+#if 0	/* Has been inlined in code.c */
+void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp),
+	word	* dpp,		/* [0...39]	IN	*/
+	word	* ep,		/* [0...39]	IN	*/
+	word	* dp)		/* [-120...-1]  IN/OUT 	*/
+{
+	int 		k;
+
+	for (k = 0; k <= 79; k++) 
+		dp[ -120 + k ] = dp[ -80 + k ];
+
+	for (k = 0; k <= 39; k++)
+		dp[ -40 + k ] = gsm_add( ep[k], dpp[k] );
+}
+#endif	/* Has been inlined in code.c */
+
+void Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc),
+
+	struct gsm_state * S,
+
+	word	* e,		/* -5..-1][0..39][40..44	IN/OUT  */
+	word	* xmaxc,	/* 				OUT */
+	word	* Mc,		/* 			  	OUT */
+	word	* xMc)		/* [0..12]			OUT */
+{
+	word	x[40];
+	word	xM[13], xMp[13];
+	word	mant, exp;
+
+	Weighting_filter(e, x);
+	RPE_grid_selection(x, xM, Mc);
+
+	APCM_quantization(	xM, xMc, &mant, &exp, xmaxc);
+	APCM_inverse_quantization(  xMc,  mant,  exp, xMp);
+
+	RPE_grid_positioning( *Mc, xMp, e );
+
+}
+
+void Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp),
+	struct gsm_state	* S,
+
+	word 		xmaxcr,
+	word		Mcr,
+	word		* xMcr,  /* [0..12], 3 bits 		IN	*/
+	word		* erp	 /* [0..39]			OUT 	*/
+)
+{
+	word	exp, mant;
+	word	xMp[ 13 ];
+
+	APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant );
+	APCM_inverse_quantization( xMcr, mant, exp, xMp );
+	RPE_grid_positioning( Mcr, xMp, erp );
+
+}
diff --git a/gsm/short_term.c b/gsm/short_term.c
new file mode 100644
index 0000000000..4f5fd7be74
--- /dev/null
+++ b/gsm/short_term.c
@@ -0,0 +1,429 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "private.h"
+
+#include "gsm.h"
+#include "proto.h"
+
+/*
+ *  SHORT TERM ANALYSIS FILTERING SECTION
+ */
+
+/* 4.2.8 */
+
+static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),
+	word 	* LARc,		/* coded log area ratio	[0..7] 	IN	*/
+	word	* LARpp)	/* out: decoded ..			*/
+{
+	register word	temp1 /* , temp2 */;
+	register long	ltmp;	/* for GSM_ADD */
+
+	/*  This procedure requires for efficient implementation
+	 *  two tables.
+ 	 *
+	 *  INVA[1..8] = integer( (32768 * 8) / real_A[1..8])
+	 *  MIC[1..8]  = minimum value of the LARc[1..8]
+	 */
+
+	/*  Compute the LARpp[1..8]
+	 */
+
+	/* 	for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) {
+	 *
+	 *		temp1  = GSM_ADD( *LARc, *MIC ) << 10;
+	 *		temp2  = *B << 1;
+	 *		temp1  = GSM_SUB( temp1, temp2 );
+	 *
+	 *		assert(*INVA != MIN_WORD);
+	 *
+	 *		temp1  = GSM_MULT_R( *INVA, temp1 );
+	 *		*LARpp = GSM_ADD( temp1, temp1 );
+	 *	}
+	 */
+
+#undef	STEP
+#define	STEP( B, MIC, INVA )	\
+		temp1    = GSM_ADD( *LARc++, MIC ) << 10;	\
+		temp1    = GSM_SUB( temp1, B << 1 );		\
+		temp1    = GSM_MULT_R( INVA, temp1 );		\
+		*LARpp++ = GSM_ADD( temp1, temp1 );
+
+	STEP(      0,  -32,  13107 );
+	STEP(      0,  -32,  13107 );
+	STEP(   2048,  -16,  13107 );
+	STEP(  -2560,  -16,  13107 );
+
+	STEP(     94,   -8,  19223 );
+	STEP(  -1792,   -8,  17476 );
+	STEP(   -341,   -4,  31454 );
+	STEP(  -1144,   -4,  29708 );
+
+	/* NOTE: the addition of *MIC is used to restore
+	 * 	 the sign of *LARc.
+	 */
+}
+
+/* 4.2.9 */
+/* Computation of the quantized reflection coefficients 
+ */
+
+/* 4.2.9.1  Interpolation of the LARpp[1..8] to get the LARp[1..8]
+ */
+
+/*
+ *  Within each frame of 160 analyzed speech samples the short term
+ *  analysis and synthesis filters operate with four different sets of
+ *  coefficients, derived from the previous set of decoded LARs(LARpp(j-1))
+ *  and the actual set of decoded LARs (LARpp(j))
+ *
+ * (Initial value: LARpp(j-1)[1..8] = 0.)
+ */
+
+static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp),
+	register word * LARpp_j_1,
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int 	i;
+	register longword ltmp;
+
+	for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
+		*LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
+		*LARp = GSM_ADD( *LARp,  SASR( *LARpp_j_1, 1));
+	}
+}
+
+static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp),
+	register word * LARpp_j_1,
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int i;
+	register longword ltmp;
+	for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+		*LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));
+	}
+}
+
+static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp),
+	register word * LARpp_j_1,
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int i;
+	register longword ltmp;
+
+	for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
+		*LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
+		*LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));
+	}
+}
+
+
+static void Coefficients_40_159 P2((LARpp_j, LARp),
+	register word * LARpp_j,
+	register word * LARp)
+{
+	register int i;
+
+	for (i = 1; i <= 8; i++, LARp++, LARpp_j++)
+		*LARp = *LARpp_j;
+}
+
+/* 4.2.9.2 */
+
+static void LARp_to_rp P1((LARp),
+	register word * LARp)	/* [0..7] IN/OUT  */
+/*
+ *  The input of this procedure is the interpolated LARp[0..7] array.
+ *  The reflection coefficients, rp[i], are used in the analysis
+ *  filter and in the synthesis filter.
+ */
+{
+	register int 		i;
+	register word		temp;
+	register longword	ltmp;
+
+	for (i = 1; i <= 8; i++, LARp++) {
+
+		/* temp = GSM_ABS( *LARp );
+	         *
+		 * if (temp < 11059) temp <<= 1;
+		 * else if (temp < 20070) temp += 11059;
+		 * else temp = GSM_ADD( temp >> 2, 26112 );
+		 *
+		 * *LARp = *LARp < 0 ? -temp : temp;
+		 */
+
+		if (*LARp < 0) {
+			temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);
+			*LARp = - ((temp < 11059) ? temp << 1
+				: ((temp < 20070) ? temp + 11059
+				:  GSM_ADD( temp >> 2, 26112 )));
+		} else {
+			temp  = *LARp;
+			*LARp =    (temp < 11059) ? temp << 1
+				: ((temp < 20070) ? temp + 11059
+				:  GSM_ADD( temp >> 2, 26112 ));
+		}
+	}
+}
+
+
+/* 4.2.10 */
+static void Short_term_analysis_filtering P4((S,rp,k_n,s),
+	struct gsm_state * S,
+	register word	* rp,	/* [0..7]	IN	*/
+	register int 	k_n, 	/*   k_end - k_start	*/
+	register word	* s	/* [0..n-1]	IN/OUT	*/
+)
+/*
+ *  This procedure computes the short term residual signal d[..] to be fed
+ *  to the RPE-LTP loop from the s[..] signal and from the local rp[..]
+ *  array (quantized reflection coefficients).  As the call of this
+ *  procedure can be done in many ways (see the interpolation of the LAR
+ *  coefficient), it is assumed that the computation begins with index
+ *  k_start (for arrays d[..] and s[..]) and stops with index k_end
+ *  (k_start and k_end are defined in 4.2.9.1).  This procedure also
+ *  needs to keep the array u[0..7] in memory for each call.
+ */
+{
+	register word		* u = S->u;
+	register int		i;
+	register word		di, zzz, ui, sav, rpi;
+	register longword 	ltmp;
+
+	for (; k_n--; s++) {
+
+		di = sav = *s;
+
+		for (i = 0; i < 8; i++) {		/* YYY */
+
+			ui    = u[i];
+			rpi   = rp[i];
+			u[i]  = sav;
+
+			zzz   = GSM_MULT_R(rpi, di);
+			sav   = GSM_ADD(   ui,  zzz);
+
+			zzz   = GSM_MULT_R(rpi, ui);
+			di    = GSM_ADD(   di,  zzz );
+		}
+
+		*s = di;
+	}
+}
+
+#if defined(USE_FLOAT_MUL) && defined(FAST)
+
+static void Fast_Short_term_analysis_filtering P4((S,rp,k_n,s),
+	struct gsm_state * S,
+	register word	* rp,	/* [0..7]	IN	*/
+	register int 	k_n, 	/*   k_end - k_start	*/
+	register word	* s	/* [0..n-1]	IN/OUT	*/
+)
+{
+	register word		* u = S->u;
+	register int		i;
+
+	float 	  uf[8],
+		 rpf[8];
+
+	register float scalef = 3.0517578125e-5;
+	register float		sav, di, temp;
+
+	for (i = 0; i < 8; ++i) {
+		uf[i]  = u[i];
+		rpf[i] = rp[i] * scalef;
+	}
+	for (; k_n--; s++) {
+		sav = di = *s;
+		for (i = 0; i < 8; ++i) {
+			register float rpfi = rpf[i];
+			register float ufi  = uf[i];
+
+			uf[i] = sav;
+			temp  = rpfi * di + ufi;
+			di   += rpfi * ufi;
+			sav   = temp;
+		}
+		*s = di;
+	}
+	for (i = 0; i < 8; ++i) u[i] = uf[i];
+}
+#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */
+
+static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
+	struct gsm_state * S,
+	register word	* rrp,	/* [0..7]	IN	*/
+	register int	k,	/* k_end - k_start	*/
+	register word	* wt,	/* [0..k-1]	IN	*/
+	register word	* sr	/* [0..k-1]	OUT	*/
+)
+{
+	register word		* v = S->v;
+	register int		i;
+	register word		sri, tmp1, tmp2;
+	register longword	ltmp;	/* for GSM_ADD  & GSM_SUB */
+
+	while (k--) {
+		sri = *wt++;
+		for (i = 8; i--;) {
+
+			/* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) );
+			 */
+			tmp1 = rrp[i];
+			tmp2 = v[i];
+			tmp2 =  ( tmp1 == MIN_WORD && tmp2 == MIN_WORD
+				? MAX_WORD
+				: 0x0FFFF & (( (longword)tmp1 * (longword)tmp2
+					     + 16384) >> 15)) ;
+
+			sri  = GSM_SUB( sri, tmp2 );
+
+			/* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) );
+			 */
+			tmp1  = ( tmp1 == MIN_WORD && sri == MIN_WORD
+				? MAX_WORD
+				: 0x0FFFF & (( (longword)tmp1 * (longword)sri
+					     + 16384) >> 15)) ;
+
+			v[i+1] = GSM_ADD( v[i], tmp1);
+		}
+		*sr++ = v[0] = sri;
+	}
+}
+
+
+#if defined(FAST) && defined(USE_FLOAT_MUL)
+
+static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
+	struct gsm_state * S,
+	register word	* rrp,	/* [0..7]	IN	*/
+	register int	k,	/* k_end - k_start	*/
+	register word	* wt,	/* [0..k-1]	IN	*/
+	register word	* sr	/* [0..k-1]	OUT	*/
+)
+{
+	register word		* v = S->v;
+	register int		i;
+
+	float va[9], rrpa[8];
+	register float scalef = 3.0517578125e-5, temp;
+
+	for (i = 0; i < 8; ++i) {
+		va[i]   = v[i];
+		rrpa[i] = (float)rrp[i] * scalef;
+	}
+	while (k--) {
+		register float sri = *wt++;
+		for (i = 8; i--;) {
+			sri -= rrpa[i] * va[i];
+			if     (sri < -32768.) sri = -32768.;
+			else if (sri > 32767.) sri =  32767.;
+
+			temp = va[i] + rrpa[i] * sri;
+			if     (temp < -32768.) temp = -32768.;
+			else if (temp > 32767.) temp =  32767.;
+			va[i+1] = temp;
+		}
+		*sr++ = va[0] = sri;
+	}
+	for (i = 0; i < 9; ++i) v[i] = va[i];
+}
+
+#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */
+
+void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s),
+
+	struct gsm_state * S,
+
+	word	* LARc,		/* coded log area ratio [0..7]  IN	*/
+	word	* s		/* signal [0..159]		IN/OUT	*/
+)
+{
+	word		* LARpp_j	= S->LARpp[ S->j      ];
+	word		* LARpp_j_1	= S->LARpp[ S->j ^= 1 ];
+
+	word		LARp[8];
+
+#undef	FILTER
+#if 	defined(FAST) && defined(USE_FLOAT_MUL)
+# 	define	FILTER 	(* (S->fast			\
+			   ? Fast_Short_term_analysis_filtering	\
+		    	   : Short_term_analysis_filtering	))
+
+#else
+# 	define	FILTER	Short_term_analysis_filtering
+#endif
+
+	Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );
+
+	Coefficients_0_12(  LARpp_j_1, LARpp_j, LARp );
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, s);
+
+	Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 14, s + 13);
+
+	Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, s + 27);
+
+	Coefficients_40_159( LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 120, s + 40);
+}
+
+void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s),
+	struct gsm_state * S,
+
+	word	* LARcr,	/* received log area ratios [0..7] IN  */
+	word	* wt,		/* received d [0..159]		   IN  */
+
+	word	* s		/* signal   s [0..159]		  OUT  */
+)
+{
+	word		* LARpp_j	= S->LARpp[ S->j     ];
+	word		* LARpp_j_1	= S->LARpp[ S->j ^=1 ];
+
+	word		LARp[8];
+
+#undef	FILTER
+#if 	defined(FAST) && defined(USE_FLOAT_MUL)
+
+# 	define	FILTER 	(* (S->fast			\
+			   ? Fast_Short_term_synthesis_filtering	\
+		    	   : Short_term_synthesis_filtering	))
+#else
+#	define	FILTER	Short_term_synthesis_filtering
+#endif
+
+	Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );
+
+	Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, wt, s );
+
+	Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 14, wt + 13, s + 13 );
+
+	Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
+	LARp_to_rp( LARp );
+	FILTER( S, LARp, 13, wt + 27, s + 27 );
+
+	Coefficients_40_159( LARpp_j, LARp );
+	LARp_to_rp( LARp );
+	FILTER(S, LARp, 120, wt + 40, s + 40);
+}
diff --git a/gsm/table.c b/gsm/table.c
new file mode 100644
index 0000000000..16a04118c1
--- /dev/null
+++ b/gsm/table.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+/*  Most of these tables are inlined at their point of use.
+ */
+
+/*  4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP
+ *      CODER AND DECODER
+ *
+ *	(Most of them inlined, so watch out.)
+ */
+
+#define	GSM_TABLE_C
+#include "private.h"
+#include	"gsm.h"
+
+/*  Table 4.1  Quantization of the Log.-Area Ratios
+ */
+/* i 		     1      2      3        4      5      6        7       8 */
+word gsm_A[8]   = {20480, 20480, 20480,  20480,  13964,  15360,   8534,  9036};
+word gsm_B[8]   = {    0,     0,  2048,  -2560,     94,  -1792,   -341, -1144};
+word gsm_MIC[8] = { -32,   -32,   -16,    -16,     -8,     -8,     -4,    -4 };
+word gsm_MAC[8] = {  31,    31,    15,     15,      7,      7,      3,     3 };
+
+
+/*  Table 4.2  Tabulation  of 1/A[1..8]
+ */
+word gsm_INVA[8]={ 13107, 13107,  13107, 13107,  19223, 17476,  31454, 29708 };
+
+
+/*   Table 4.3a  Decision level of the LTP gain quantizer
+ */
+/*  bc		      0	        1	  2	     3			*/
+word gsm_DLB[4] = {  6554,    16384,	26214,	   32767	};
+
+
+/*   Table 4.3b   Quantization levels of the LTP gain quantizer
+ */
+/* bc		      0          1        2          3			*/
+word gsm_QLB[4] = {  3277,    11469,	21299,	   32767	};
+
+
+/*   Table 4.4	 Coefficients of the weighting filter
+ */
+/* i		    0      1   2    3   4      5      6     7   8   9    10  */
+word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 };
+
+
+/*   Table 4.5 	 Normalized inverse mantissa used to compute xM/xmax 
+ */
+/* i		 	0        1    2      3      4      5     6      7   */
+word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 };
+
+
+/*   Table 4.6	 Normalized direct mantissa used to compute xM/xmax
+ */
+/* i                  0      1       2      3      4      5      6      7   */
+word gsm_FAC[8]	= { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 };
diff --git a/gsm/toast.c b/gsm/toast.c
new file mode 100644
index 0000000000..bea46827f6
--- /dev/null
+++ b/gsm/toast.c
@@ -0,0 +1,800 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include	"toast.h"
+
+/*  toast -- lossy sound compression using the gsm library.
+ */
+
+char   * progname;
+
+int	f_decode   = 0;		/* decode rather than encode	 (-d) */
+int 	f_cat	   = 0;		/* write to stdout; implies -p   (-c) */
+int	f_force	   = 0;		/* don't ask about replacements  (-f) */
+int	f_precious = 0;		/* avoid deletion of original	 (-p) */
+int	f_fast	   = 0;		/* use faster fpt algorithm	 (-F) */
+int	f_verbose  = 0;		/* debugging			 (-V) */
+int	f_ltp_cut  = 0;		/* LTP cut-off margin	      	 (-C) */
+
+struct stat instat;		/* stat (inname) 		 */
+
+FILE	*in, 	 *out;
+char	*inname, *outname;
+
+/*
+ *  The function (*output)() writes a frame of 160 samples given as
+ *  160 signed 16 bit values (gsm_signals) to <out>.
+ *  The function (*input)() reads one such frame from <in>.
+ *  The function (*init_output)() begins output (e.g. writes a header).,
+ *  The function (*init_input)() begins input (e.g. skips a header).
+ *
+ *  There are different versions of input, output, init_input and init_output
+ *  for different formats understood by toast; which ones are used 
+ *  depends on the command line arguments and, in their absence, the
+ *  filename; the fallback is #defined in toast.h
+ *
+ *  The specific implementations of input, output, init_input and init_output
+ *  for a format `foo' live in toast_foo.c.
+ */
+
+int	(*output   ) P((gsm_signal *)),
+	(*input    ) P((gsm_signal *));
+int	(*init_input)  P((void)),
+	(*init_output) P((void));
+
+static int	generic_init P0() { return 0; }	/* NOP */
+
+struct fmtdesc {
+
+	char * name, * longname, * suffix;
+
+	int  (* init_input )  P((void)),
+	     (* init_output)  P((void));
+
+	int  (* input ) P((gsm_signal * )),
+	     (* output) P((gsm_signal * ));
+
+} f_audio = {
+		"audio",
+		"8 kHz, 8 bit u-law encoding with Sun audio header", ".au",
+		audio_init_input,
+		audio_init_output,
+		ulaw_input,
+		ulaw_output
+}, f_ulaw = {
+		"u-law", "plain 8 kHz, 8 bit u-law encoding", ".u",
+		generic_init,
+		generic_init,
+		ulaw_input,
+		ulaw_output 
+
+}, f_alaw = {
+		"A-law", "8 kHz, 8 bit A-law encoding", ".A",
+		generic_init,
+		generic_init,
+		alaw_input,
+		alaw_output
+
+}, f_linear = {
+		"linear",
+		"16 bit (13 significant) signed 8 kHz signal", ".l",
+		generic_init,
+		generic_init,
+		linear_input,
+		linear_output
+};
+
+struct fmtdesc * alldescs[] = {
+	&f_audio,
+	&f_alaw,
+	&f_ulaw,
+	&f_linear,
+	(struct fmtdesc *)NULL
+};
+
+#define	DEFAULT_FORMAT	f_ulaw		/* default audio format, others	*/
+					/* are: f_alaw,f_audio,f_linear */
+struct fmtdesc * f_format  = 0;
+
+/*
+ *  basename + suffix of a pathname
+ */
+static char * endname P1((name), char * name)
+{
+	if (name) {
+		char * s = strrchr(name, '/');
+		if (s && s[1]) name = s + 1;
+	}
+	return name;
+
+}
+
+/*
+ *  Try to figure out what we're supposed to do from the argv[0], if
+ *  any, and set the parameters accordingly.
+ */
+static void parse_argv0 P1((av0), char * av0 )
+{
+	int 	l;
+
+	progname = av0 = endname(av0 ? av0 : "toast");
+
+	/*  If the name starts with `un', we want to decode, not code.
+	 *  If the name ends in `cat', we want to write to stdout,
+	 *  and decode as well.
+	 */
+
+	if (!strncmp(av0, "un", 2)) f_decode = 1;
+	if (  (l = strlen(av0)) >= 3 /* strlen("cat") */
+	   && !strcmp( av0 + l - 3, "cat" )) f_cat = f_decode = 1;
+}
+
+
+/*
+ *  Check whether the name (possibly generated by appending
+ *  .gsm to something else) is short enough for this system.
+ */
+static int length_okay P1((name), char * name)
+{
+	long	max_filename_length = 0;
+	char	* end;
+
+	/* If our _pathname_ is too long, we'll usually not be
+	 * able to open the file at all -- don't worry about that.
+	 * 
+	 * But if the _filename_ is too long, there is danger of
+	 * silent truncation on some systems, which results
+	 * in the target replacing the source!
+	 */
+
+	if (!name) return 0;
+	end = endname(name);
+
+#ifdef	NAME_MAX
+	max_filename_length  = NAME_MAX;
+#else
+#ifdef	_PC_NAME_MAX
+#ifdef USE_PATHCONF
+	{	char * s, tmp; 
+		
+		/*  s = dirname(name)
+		 */
+		if ((s = end) > name) {
+			if (s > name + 1) s--;
+			tmp = s;
+			*s  = 0;
+		}
+
+		errno = 0;
+		max_filename_length = pathconf(s > name ? name : ".",
+			_PC_NAME_MAX);
+		if (max_filename_length == -1 && errno) {
+			perror( s > name ? name : "." );
+			fprintf(stderr,
+		"%s: cannot get dynamic filename length limit for %s.\n",
+				progname, s > name ? name : ".");
+			return 0;
+		}
+		if (s > name) *s = tmp;
+	}
+#endif /* USE_PATHCONF  */
+#endif /* _PC_NAME_MAX  */
+#endif /* !NAME_MAX 	*/
+
+	if (max_filename_length > 0 && strlen(end) > max_filename_length) {
+		fprintf(stderr,
+			"%s: filename \"%s\" is too long (maximum is %ld)\n",
+			progname, endname(name), max_filename_length );
+		return 0;
+	}
+
+	return 1;
+}
+
+/*
+ *  Return a pointer the suffix of a string, if any.
+ *  A suffix alone has no suffix, an empty suffix can not be had.
+ */
+static char * suffix P2((name, suf), char *name, char * suf) 
+{
+	size_t nlen = strlen(name);
+	size_t slen = strlen(suf);
+
+	if (!slen || nlen <= slen) return (char *)0;
+	name += nlen - slen;
+	return memcmp(name, suf, slen) ? (char *)0 : name;
+}
+
+
+static void catch_signals P1((fun), SIGHANDLER_T (*fun) ()) 
+{
+#ifdef	SIGHUP
+	signal( SIGHUP,   fun );
+#endif
+#ifdef	SIGINT
+	signal( SIGINT,   fun );
+#endif
+#ifdef	SIGPIPE
+	signal( SIGPIPE,  fun );
+#endif
+#ifdef	SIGTERM
+	signal( SIGTERM,  fun );
+#endif
+#ifdef	SIGXFSZ
+	signal( SIGXFSZ,  fun );
+#endif
+}
+
+static SIGHANDLER_T onintr P0()
+{
+	char * tmp = outname;
+
+#ifdef	HAS_SYSV_SIGNALS
+	catch_signals( SIG_IGN );
+#endif
+
+	outname = (char *)0;
+	if (tmp) (void)unlink(tmp);
+
+	exit(1);
+}
+
+/*
+ *  Allocate some memory and complain if it fails.
+ */
+static char * emalloc P1((len), size_t len)
+{
+	char * s;
+	if (!(s = malloc(len))) {
+		fprintf(stderr, "%s: failed to malloc %d bytes -- abort\n",
+			progname, len);
+		onintr();
+		exit(1);
+	}
+	return s;
+}
+
+static char* normalname P3((name, want, cut), char *name, char *want,char *cut)
+{
+	size_t	maxlen;
+	char 	* s, * p;
+
+	p = (char *)0;
+	if (!name) return p;
+
+	maxlen = strlen(name) + 1 + strlen(want) + strlen(cut);
+	p = strcpy(emalloc(maxlen), name);
+
+	if (s = suffix(p, cut)) strcpy(s, want);
+	else if (*want && !suffix(p, want)) strcat(p, want);
+
+	return p;
+}
+
+/*
+ *  Generate a `plain' (non-encoded) name from a given name.
+ */
+static char * plainname P1((name), char *name)
+{
+	return normalname(name, "", SUFFIX_TOASTED );
+}
+
+/*
+ *  Generate a `code' name from a given name.
+ */
+static char * codename P1((name), char *name)
+{
+	return normalname( name, SUFFIX_TOASTED, "" );
+}
+
+/*
+ *  If we're supposed to ask (fileno (stderr) is a tty, and f_force not
+ *  set), ask the user whether to overwrite a file or not.
+ */
+static int ok_to_replace P1(( name ), char * name)
+{
+	int reply, c;
+
+	if (f_force) return 1;			/* YES, do replace   */
+	if (!isatty(fileno(stderr))) return 0;	/* NO, don't replace */
+
+	fprintf(stderr,
+		"%s already exists; do you wish to overwrite %s (y or n)? ",
+		name, name);
+	fflush(stderr);
+
+	for (c = reply = getchar(); c != '\n' && c != EOF; c = getchar()) ;
+	if (reply == 'y') return 1;
+
+	fprintf(stderr, "\tnot overwritten\n");
+	return 0;
+}
+
+static void update_mode P0()
+{
+	if (!instat.st_nlink) return;		/* couldn't stat in */
+
+#ifdef HAS_FCHMOD
+	if (fchmod(fileno(out), instat.st_mode & 07777)) {
+		perror(outname);
+		fprintf(stderr, "%s: could not change file mode of \"%s\"\n",
+			progname, outname);
+	}
+#else 
+#ifdef HAS_CHMOD
+	if (outname && chmod(outname, instat.st_mode & 07777)) {
+		perror(outname);
+		fprintf(stderr, "%s: could not change file mode of \"%s\"\n",
+			progname, outname);
+	}
+#endif /* HAS_CHMOD  */
+#endif /* HAS_FCHMOD */
+}
+
+static void update_own P0()
+{
+	if (!instat.st_nlink) return; /* couldn't stat in */
+#ifdef HAS_FCHOWN
+	(void)fchown(fileno(out), instat.st_uid, instat.st_gid);
+#else 
+#ifdef HAS_CHOWN
+	(void)chown(outname, instat.st_uid, instat.st_gid);
+#endif /* HAS_CHOWN  */
+#endif /* HAS_FCHOWN */
+}
+
+static void update_times P0()
+{
+	if (!instat.st_nlink) return; 	/* couldn't stat in */
+
+#ifdef HAS_UTIMES
+	if (outname) {
+		struct timeval tv[2];
+
+		tv[0].tv_sec  = instat.st_atime;
+		tv[1].tv_sec  = instat.st_mtime;
+		tv[0].tv_usec = tv[1].tv_usec = 0;
+		(void) utimes(outname, tv);
+	}
+#else
+#ifdef HAS_UTIME
+
+	if (outname) {
+
+#ifdef	HAS_UTIMBUF
+		struct utimbuf ut;
+
+		ut.actime     = instat.st_atime;
+		ut.modtime    = instat.st_mtime;
+
+#	ifdef	HAS_UTIMEUSEC
+		ut.acusec     = instat.st_ausec;
+		ut.modusec    = instat.st_musec;
+#	endif 	/* HAS_UTIMEUSEC */
+
+		(void) utime(outname, &ut);
+
+#else /* UTIMBUF */
+
+		time_t ut[2];
+
+		ut[0] = instat.st_atime;
+		ut[1] = instat.st_mtime;
+
+		(void) utime(outname, ut);
+
+#endif	/* UTIMBUF */
+	}
+#endif /* HAS_UTIME */
+#endif /* HAS_UTIMES */
+}
+
+
+static int okay_as_input P3((name,f,st), char* name, FILE* f, struct stat * st)
+{
+# ifdef	HAS_FSTAT
+	if (fstat(fileno(f), st) < 0)
+# else
+	if (stat(name, st) < 0)
+# endif
+	{
+		perror(name);
+		fprintf(stderr, "%s: cannot stat \"%s\"\n", progname, name);
+		return 0;
+	}
+
+	if (!S_ISREG(st->st_mode)) {
+		fprintf(stderr,
+			"%s: \"%s\" is not a regular file -- unchanged.\n",
+			progname, name);
+		return 0;
+	}
+	if (st->st_nlink > 1 && !f_cat && !f_precious) {
+		fprintf(stderr, 
+		      "%s: \"%s\" has %s other link%s -- unchanged.\n",
+			progname,name,st->st_nlink - 1,"s" + (st->st_nlink<=2));
+		return 0;
+	}
+	return 1;
+}
+
+static void prepare_io P1(( desc), struct fmtdesc * desc)
+{
+	output      = desc->output;
+	input       = desc->input;
+
+	init_input  = desc->init_input;
+	init_output = desc->init_output;
+}
+
+static struct fmtdesc * grok_format P1((name), char * name)
+{
+	char * c;
+	struct fmtdesc ** f;
+
+	if (name) {
+		c = plainname(name);
+
+		for (f = alldescs; *f; f++) {
+			if (  (*f)->suffix
+			   && *(*f)->suffix
+			   && suffix(c, (*f)->suffix)) {
+
+				free(c);
+				return *f;
+			}
+		}
+
+		free(c);
+	}
+	return (struct fmtdesc *)0;
+}
+
+static int open_input P2((name, st), char * name, struct stat * st)
+{
+	struct fmtdesc * f = f_format;
+
+	st->st_nlink = 0;	/* indicates `undefined' value */
+	if (!name) {
+		inname = (char *)NULL;
+		in     = stdin;
+#ifdef	HAS__FSETMODE
+		_fsetmode(in, "b");
+#endif
+	}
+	else {
+		if (f_decode) inname = codename(name);
+		else {
+			if (!f_cat && suffix(name, SUFFIX_TOASTED)) {
+				fprintf(stderr,
+			"%s: %s already has \"%s\" suffix -- unchanged.\n",
+					progname, name, SUFFIX_TOASTED );
+				return 0;
+			}
+			inname = strcpy(emalloc(strlen(name)+1), name);
+		}
+		if (!(in = fopen(inname, READ))) {
+			perror(inname);	/* not guaranteed to be valid here */
+			fprintf(stderr, "%s: cannot open \"%s\" for reading\n",
+				progname, inname);
+			return 0;
+		}
+		if (!okay_as_input(inname, in, st)) return 0;
+		if (!f) f = grok_format(inname);
+	}
+	prepare_io( f ? f : & DEFAULT_FORMAT );
+	return 1;
+}
+
+static int open_output P1((name), char *name)
+{
+	if (!name || f_cat) {
+		out     = stdout;
+		outname = (char *)NULL;
+#ifdef	HAS__FSETMODE
+		_fsetmode(out, "b"); 
+#endif
+	}
+	else {
+		int outfd = -1;
+		char * o;
+
+		o = (*(f_decode ? plainname : codename))(name);
+		if (!length_okay(o)) return 0;
+		if ((outfd = open(o, O_WRITE_EXCL, 0666)) >= 0)
+			out = fdopen(outfd, WRITE);
+		else if (errno != EEXIST) out = (FILE *)NULL;
+		else if (ok_to_replace(o)) out = fopen(o, WRITE);
+		else return 0;
+
+		if (!out) {
+			perror(o);
+			fprintf(stderr,
+				"%s: can't open \"%s\" for writing\n",
+				progname, o);
+			if (outfd >= 0) (void)close(outfd);
+			return 0;
+		}
+
+		outname = o;
+	}
+	return 1;
+}
+
+static int process_encode P0()
+{
+	gsm      	r;
+	gsm_signal    	s[ 160 ];
+	gsm_frame	d;
+ 
+	int		cc;
+
+	if (!(r = gsm_create())) {
+		perror(progname);
+		return -1;
+	}
+	(void)gsm_option(r, GSM_OPT_FAST,       &f_fast);
+	(void)gsm_option(r, GSM_OPT_VERBOSE,    &f_verbose);
+	(void)gsm_option(r, GSM_OPT_LTP_CUT,	&f_ltp_cut);
+
+	while ((cc = (*input)(s)) > 0) {
+		if (cc < sizeof(s) / sizeof(*s))
+			memset((char *)(s+cc), 0, sizeof(s)-(cc * sizeof(*s)));
+		gsm_encode(r, s, d);
+		if (fwrite((char *)d, sizeof(d), 1, out) != 1) {
+			perror(outname ? outname : "stdout");
+			fprintf(stderr, "%s: error writing to %s\n",
+				progname, outname ? outname : "stdout");
+			gsm_destroy(r);
+			return -1;
+		}
+	}
+	if (cc < 0) {
+		perror(inname ? inname : "stdin");
+		fprintf(stderr, "%s: error reading from %s\n",
+			progname, inname ? inname : "stdin");
+		gsm_destroy(r);
+		return -1;
+	}
+	gsm_destroy(r);
+
+	return 0;
+}
+
+static int process_decode P0()
+{
+	gsm      	r;
+	gsm_frame	s;
+	gsm_signal	d[ 160 ];
+ 
+	int		cc;
+
+	if (!(r = gsm_create())) {	/* malloc failed */
+		perror(progname);
+		return -1;
+	}
+	(void)gsm_option(r, GSM_OPT_FAST,    &f_fast);
+	(void)gsm_option(r, GSM_OPT_VERBOSE, &f_verbose);
+
+	while ((cc = fread(s, 1, sizeof(s), in)) > 0) {
+
+		if (cc != sizeof(s)) {
+			if (cc >= 0) fprintf(stderr,
+			"%s: incomplete frame (%d byte%s missing) from %s\n",
+					progname, sizeof(s) - cc,
+					"s" + (sizeof(s) - cc == 1),
+					inname ? inname : "stdin" );
+			gsm_destroy(r);
+			errno = 0;
+			return -1;
+		}
+		if (gsm_decode(r, s, d)) {
+			fprintf(stderr, "%s: bad frame in %s\n", 
+				progname, inname ? inname : "stdin");
+			gsm_destroy(r);
+			errno = 0;
+			return -1;
+		}
+
+		if ((*output)(d) < 0) {
+			perror(outname);
+			fprintf(stderr, "%s: error writing to %s\n",
+					progname, outname);
+			gsm_destroy(r);
+			return -1;
+		}
+	}
+
+	if (cc < 0) {
+		perror(inname ? inname : "stdin" );
+		fprintf(stderr, "%s: error reading from %s\n", progname,
+			inname ? inname : "stdin");
+		gsm_destroy(r);
+		return -1;
+	}
+
+	gsm_destroy(r);
+	return 0;
+}
+
+static int process P1((name), char * name)
+{
+	int step = 0;
+
+	out     = (FILE *)0;
+	in      = (FILE *)0;
+
+	outname = (char *)0;
+	inname  = (char *)0;
+
+	if (!open_input(name, &instat) || !open_output(name))
+		goto err;
+
+	if ((*(f_decode ? init_output    : init_input))()) {
+		fprintf(stderr, "%s: error %s %s\n",
+			progname,
+			f_decode ? "writing header to" : "reading header from",
+			f_decode ? (outname ? outname : "stdout")
+				 : (inname ? inname : "stdin"));
+		goto err;
+	}
+
+	if ((*(f_decode ? process_decode : process_encode))())
+		goto err;
+
+	if (fflush(out) < 0 || ferror(out)) {
+		perror(outname ? outname : "stdout");
+		fprintf(stderr, "%s: error writing \"%s\"\n", progname,
+				outname ? outname:"stdout");
+		goto err;
+	}
+
+	if (out != stdout) {
+
+		update_times();
+		update_mode ();
+		update_own  ();
+
+		if (fclose(out) < 0) {
+			perror(outname);
+			fprintf(stderr, "%s: error writing \"%s\"\n",
+				progname, outname);
+			goto err;
+		}
+		if (outname != name) free(outname);
+		outname = (char *)0;
+	}
+	out = (FILE *)0;
+	if (in  != stdin) {
+		(void)fclose(in), in = (FILE *)0;
+		if (!f_cat && !f_precious) {
+			if (unlink(inname) < 0) {
+				perror(inname);
+				fprintf(stderr,
+					"%s: source \"%s\" not deleted.\n",
+					progname, inname);
+			}
+			goto err;
+		}
+		if (inname != name) free(inname);
+		inname = (char *)0;
+	}
+	return 0;
+
+	/*
+	 *  Error handling and cleanup.
+	 */
+err:
+	if (out && out != stdout) {
+		(void)fclose(out), out = (FILE *)0;
+		if (unlink(outname) < 0 && errno != ENOENT && errno != EINTR) {
+			perror(outname);
+			fprintf(stderr, "%s: could not unlink \"%s\"\n",
+				progname, outname);
+		}
+	}
+	if (in && in != stdin) (void)fclose(in), in = (FILE *)0;
+
+	if (inname  && inname  != name) free(inname);
+	if (outname && outname != name) free(outname);
+
+	return -1;
+}
+
+static void version P0()
+{
+	printf( "%s 1.0, version %s\n",
+		progname,
+		"$Id$" );
+}
+
+static void help P0()
+{
+	printf("Usage: %s [-fcpdhvaulsFC] [files...]\n", progname);
+	printf("\n");
+
+	printf(" -f  force     Replace existing files without asking\n");
+	printf(" -c  cat       Write to stdout, do not remove source files\n");
+	printf(" -d  decode    Decode data (default is encode)\n");
+	printf(" -p  precious  Do not delete the source\n");
+	printf("\n");
+
+	printf(" -u  u-law     Force 8 kHz/8 bit u-law in/output format\n");
+	printf(" -s  sun .au   Force Sun .au u-law in/output format\n");
+	printf(" -a  A-law     Force 8 kHz/8 bit A-law in/output format\n");
+	printf(" -l  linear    Force 16 bit linear in/output format\n");
+	printf("\n");
+
+	printf(" -F  fast      Sacrifice conformance to performance\n");
+	printf(" -C  cutoff    Ignore most samples during LTP\n");
+	printf(" -v  version   Show version information\n");
+	printf(" -h  help      Print this text\n");
+	printf("\n");
+}
+
+
+static void set_format P1((f), struct fmtdesc * f)
+{
+	if (f_format && f_format != f) {
+		fprintf( stderr,
+	"%s: only one of -[uals] is possible (%s -h for help)\n",
+			progname, progname);
+		exit(1);
+	}
+
+	f_format = f;
+}
+
+int main P2((ac, av), int ac, char **av)
+{
+	int  		opt;
+	extern int	optind;
+	extern char	* optarg;
+
+	parse_argv0(*av);
+
+	while ((opt = getopt(ac, av, "fcdpvhuaslVFC:")) != EOF) switch (opt) {
+
+	case 'd': f_decode   = 1; break;
+	case 'f': f_force    = 1; break;
+	case 'c': f_cat      = 1; break;
+	case 'p': f_precious = 1; break;
+	case 'F': f_fast     = 1; break;
+	case 'C': f_ltp_cut  = 100; break;
+#ifndef	NDEBUG
+	case 'V': f_verbose  = 1; break;	/* undocumented */
+#endif
+
+	case 'u': set_format( &f_ulaw   ); break;
+	case 'l': set_format( &f_linear ); break;
+	case 'a': set_format( &f_alaw	); break;
+	case 's': set_format( &f_audio  ); break;
+
+	case 'v': version(); exit(0);
+	case 'h': help();    exit(0);
+
+	default: 
+	usage:
+		fprintf(stderr,
+	"Usage: %s [-fcpdhvuaslFC] [files...] (-h for help)\n",
+			progname);
+		exit(1);
+	}
+
+	f_precious |= f_cat;
+
+	av += optind;
+	ac -= optind;
+
+	catch_signals(onintr);
+
+	if (ac <= 0) process( (char *)0 );
+	else while (ac--) process( *av++ );
+
+	exit(0);
+}
diff --git a/gsm/toast.h b/gsm/toast.h
new file mode 100644
index 0000000000..1eaeb6c566
--- /dev/null
+++ b/gsm/toast.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#ifndef	TOAST_H
+#define	TOAST_H				/* Guard against multiple includes */
+
+#include "config.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <stdio.h>
+#include <ctype.h>
+#include <signal.h>
+
+#include <errno.h>
+#ifndef	HAS_ERRNO_DECL
+	 extern int	errno;
+#endif
+
+#ifdef	HAS_LIMITS_H
+#include <limits.h>
+#endif
+
+#ifdef	HAS_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef	HAS_UTIME
+# ifdef	HAS_UTIME_H
+#  include <utime.h>
+# endif
+#endif
+
+#include "gsm.h"
+
+#ifndef	S_ISREG
+#define	S_ISREG(x)	((x) & S_IFREG)
+#endif	/* S_ISREG */
+
+
+# define	READ	"rb"
+# define	WRITE	"wb"
+#ifdef  O_BINARY
+# define	O_WRITE_EXCL	O_WRONLY|O_CREAT|O_EXCL|O_BINARY
+#else
+# define	O_WRITE_EXCL	O_WRONLY|O_CREAT|O_EXCL
+#endif
+
+#ifndef SIGHANDLER_T
+#define SIGHANDLER_T	void	/* what does a signal handler return? */
+#endif
+
+
+#ifdef	HAS_STRING_H
+#include	<string.h>
+#else
+#	ifdef HAS_STRINGS_H
+#	include <strings.h>
+#	else
+#		include "proto.h"
+
+		extern int	strlen	P((char *));
+		extern char *	strcpy  P((char *, char *));
+		extern char *	strcat  P((char *,  char *));
+		extern char *	strrchr P((char *, int));
+
+#		include "unproto.h"
+#	endif
+#endif
+
+
+#ifdef	HAS_STDLIB_H
+#include	<stdlib.h>
+#else
+#	include "proto.h"
+#	ifdef	HAS_MALLOC_H
+#	include <malloc.h>
+#	else
+		extern char	* malloc P((unsigned));
+#	endif
+	extern int	exit P((int));
+#	include "unproto.h"
+#endif
+
+
+#ifdef	HAS_UNISTD_H
+#	include	<unistd.h>
+#endif
+
+/*
+ *	This suffix is tacked onto/removed from filenames
+ *	similar to the way freeze and compress do it.
+ */
+#define	SUFFIX_TOASTED		".gsm"
+
+#include	"proto.h"
+
+extern int 	audio_init_input P((void)), audio_init_output P((void));
+extern int	ulaw_input   P((gsm_signal*)), ulaw_output   P((gsm_signal *));
+extern int	alaw_input   P((gsm_signal*)), alaw_output   P((gsm_signal *));
+extern int	linear_input P((gsm_signal*)), linear_output P((gsm_signal *));
+
+#endif		/* TOAST_H */
diff --git a/gsm/toast_alaw.c b/gsm/toast_alaw.c
new file mode 100644
index 0000000000..98917372e1
--- /dev/null
+++ b/gsm/toast_alaw.c
@@ -0,0 +1,334 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include	"toast.h"
+
+/*  toast_alaw.c -- manipulate A-law encoded sound.
+ */
+
+extern FILE	* in, * out;
+
+#define	A2S(x)	(a2s[  (unsigned char )(x)       ])
+#define	S2A(x)	(s2a[ ((unsigned short)(x)) >> 4 ])
+
+static unsigned short a2s[] = {
+
+ 60032, 60288, 59520, 59776, 61056, 61312, 60544, 60800,
+ 57984, 58240, 57472, 57728, 59008, 59264, 58496, 58752,
+ 62784, 62912, 62528, 62656, 63296, 63424, 63040, 63168,
+ 61760, 61888, 61504, 61632, 62272, 62400, 62016, 62144,
+ 43520, 44544, 41472, 42496, 47616, 48640, 45568, 46592,
+ 35328, 36352, 33280, 34304, 39424, 40448, 37376, 38400,
+ 54528, 55040, 53504, 54016, 56576, 57088, 55552, 56064,
+ 50432, 50944, 49408, 49920, 52480, 52992, 51456, 51968,
+ 65192, 65208, 65160, 65176, 65256, 65272, 65224, 65240,
+ 65064, 65080, 65032, 65048, 65128, 65144, 65096, 65112,
+ 65448, 65464, 65416, 65432, 65512, 65528, 65480, 65496,
+ 65320, 65336, 65288, 65304, 65384, 65400, 65352, 65368,
+ 64160, 64224, 64032, 64096, 64416, 64480, 64288, 64352,
+ 63648, 63712, 63520, 63584, 63904, 63968, 63776, 63840,
+ 64848, 64880, 64784, 64816, 64976, 65008, 64912, 64944,
+ 64592, 64624, 64528, 64560, 64720, 64752, 64656, 64688,
+  5504,  5248,  6016,  5760,  4480,  4224,  4992,  4736,
+  7552,  7296,  8064,  7808,  6528,  6272,  7040,  6784,
+  2752,  2624,  3008,  2880,  2240,  2112,  2496,  2368,
+  3776,  3648,  4032,  3904,  3264,  3136,  3520,  3392,
+ 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944,
+ 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136,
+ 11008, 10496, 12032, 11520,  8960,  8448,  9984,  9472,
+ 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568,
+   344,   328,   376,   360,   280,   264,   312,   296,
+   472,   456,   504,   488,   408,   392,   440,   424,
+    88,    72,   120,   104,    24,     8,    56,    40,
+   216,   200,   248,   232,   152,   136,   184,   168,
+  1376,  1312,  1504,  1440,  1120,  1056,  1248,  1184,
+  1888,  1824,  2016,  1952,  1632,  1568,  1760,  1696,
+   688,   656,   752,   720,   560,   528,   624,   592,
+   944,   912,  1008,   976,   816,   784,   880,   848
+
+};
+
+
+static unsigned char  s2a[] = {
+
+	213,212,215,214,209,208,211,210,221,220,223,222,217,216,219,218,
+	197,196,199,198,193,192,195,194,205,204,207,206,201,200,203,202,
+	245,245,244,244,247,247,246,246,241,241,240,240,243,243,242,242,
+	253,253,252,252,255,255,254,254,249,249,248,248,251,251,250,250,
+	229,229,229,229,228,228,228,228,231,231,231,231,230,230,230,230,
+	225,225,225,225,224,224,224,224,227,227,227,227,226,226,226,226,
+	237,237,237,237,236,236,236,236,239,239,239,239,238,238,238,238,
+	233,233,233,233,232,232,232,232,235,235,235,235,234,234,234,234,
+	149,149,149,149,149,149,149,149,148,148,148,148,148,148,148,148,
+	151,151,151,151,151,151,151,151,150,150,150,150,150,150,150,150,
+	145,145,145,145,145,145,145,145,144,144,144,144,144,144,144,144,
+	147,147,147,147,147,147,147,147,146,146,146,146,146,146,146,146,
+	157,157,157,157,157,157,157,157,156,156,156,156,156,156,156,156,
+	159,159,159,159,159,159,159,159,158,158,158,158,158,158,158,158,
+	153,153,153,153,153,153,153,153,152,152,152,152,152,152,152,152,
+	155,155,155,155,155,155,155,155,154,154,154,154,154,154,154,154,
+	133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,
+	132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,
+	135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,
+	134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,
+	129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,
+	128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
+	131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,
+	130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,
+	141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,
+	140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,
+	143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,
+	142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,
+	137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,
+	136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,
+	139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,
+	138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,
+	181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+	181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,
+	180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+	180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,
+	183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+	183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,
+	182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+	182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,
+	177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+	177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,
+	176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+	176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,
+	179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+	179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,
+	178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+	178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,
+	189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+	189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,
+	188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+	188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,
+	191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+	191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,
+	190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+	190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,
+	185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+	185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,
+	184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+	184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,
+	187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+	187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,
+	186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+	186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,
+	165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+	165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+	165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+	165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,
+	164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+	164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+	164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+	164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,
+	167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+	167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+	167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+	167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,
+	166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+	166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+	166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+	166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,
+	161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+	161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+	161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+	161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,
+	160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+	160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+	160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+	160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,
+	163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+	163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+	163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+	163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,
+	162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+	162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+	162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+	162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,
+	173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+	173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+	173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+	173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,
+	172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+	172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+	172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+	172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,
+	175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+	175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+	175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+	175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,
+	174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+	174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+	174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+	174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,
+	169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+	169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+	169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+	169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,
+	168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+	168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+	168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+	168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,
+	171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+	171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+	171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+	171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,
+	170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+	170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+	170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+	170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,
+	 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+	 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+	 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+	 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
+	 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+	 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+	 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+	 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
+	 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+	 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+	 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+	 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
+	 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+	 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+	 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+	 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
+	 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+	 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+	 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+	 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
+	 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+	 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+	 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+	 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+	 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+	 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+	 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+	 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
+	 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+	 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+	 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+	 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
+	 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+	 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+	 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+	 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34,
+	 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+	 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+	 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+	 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+	 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+	 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+	 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+	 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
+	 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+	 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+	 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+	 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
+	 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+	 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+	 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+	 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38,
+	 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+	 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+	 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+	 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39,
+	 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+	 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+	 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+	 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
+	 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+	 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+	 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+	 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37,
+	 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+	 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58,
+	 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+	 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
+	 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+	 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
+	 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+	 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57,
+	 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+	 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62,
+	 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+	 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63,
+	 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+	 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
+	 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+	 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
+	 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+	 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+	 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+	 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+	 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+	 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
+	 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+	 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+	 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+	 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54,
+	 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+	 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+	 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+	 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
+	 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+	 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+	 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+	 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+	  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
+	  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
+	 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+	 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+	 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+	 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+	  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,
+	  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
+	  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+	  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
+	  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+	  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
+	  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,
+	  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
+	 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
+	 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25,
+	 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31,
+	 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29,
+	 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19,
+	 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17,
+	 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
+	 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21,
+	106,106,106,106,107,107,107,107,104,104,104,104,105,105,105,105,
+	110,110,110,110,111,111,111,111,108,108,108,108,109,109,109,109,
+	 98, 98, 98, 98, 99, 99, 99, 99, 96, 96, 96, 96, 97, 97, 97, 97,
+	102,102,102,102,103,103,103,103,100,100,100,100,101,101,101,101,
+	122,122,123,123,120,120,121,121,126,126,127,127,124,124,125,125,
+	114,114,115,115,112,112,113,113,118,118,119,119,116,116,117,117,
+	 74, 75, 72, 73, 78, 79, 76, 77, 66, 67, 64, 65, 70, 71, 68, 69,
+	 90, 91, 88, 89, 94, 95, 92, 93, 82, 83, 80, 81, 86, 87, 84, 85
+};
+
+int alaw_input P1((buf), gsm_signal * buf) 
+{
+	int  i, c;
+
+	for (i = 0; i < 160 && (c = fgetc(in)) != EOF; i++) buf[i] = A2S( c );
+	if (c == EOF && ferror(in)) return -1;
+	return i;
+}
+
+int alaw_output P1((buf), gsm_signal * buf) 
+{
+	int  i;
+
+	for (i = 0; i < 160; i++, buf++)
+		if (fputc( S2A( *buf ), out) == EOF) return -1;
+	return 0;
+}
+
diff --git a/gsm/toast_audio.c b/gsm/toast_audio.c
new file mode 100644
index 0000000000..42300e3a9d
--- /dev/null
+++ b/gsm/toast_audio.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include	"toast.h"
+
+/*  toast_audio -- functions to manipulate SunOS audio files.
+ *
+ *  This is reverse engineered from our present soundfiles
+ *  and in no way portable, durable or aesthetically pleasing.
+ */
+
+extern FILE	* in, 	  * out;
+extern char	* inname;
+extern char	* progname;
+
+extern int	(*output) P((gsm_signal *)),
+		(*input ) P((gsm_signal *));
+
+extern int	alaw_input   P((gsm_signal *)),
+		ulaw_input   P((gsm_signal *)),
+		linear_input P((gsm_signal *));
+
+extern int	ulaw_output P((gsm_signal *));
+
+static int put_u32 P2((f, u), FILE * f, unsigned long u)
+{
+	/*  Write a 32-bit unsigned value msb first. 
+	 */
+	if (  putc( (char)((u>>24) & 0x0FF), f) == EOF
+	   || putc( (char)((u>>16) & 0x0FF), f) == EOF
+	   || putc( (char)((u>> 8) & 0x0FF), f) == EOF
+	   || putc( (char)( u      & 0x0FF), f) == EOF) return -1;
+
+	return 0;
+}
+
+static int get_u32 P2((f, up), FILE * f, unsigned long * up)
+{
+	/*  Read a 32-bit unsigned value msb first.
+	 */
+	int		i;
+	unsigned long 	u;
+
+	if (  				      (i = getc(f)) == EOF
+	   || ((u =        (unsigned char)i), (i = getc(f)) == EOF)
+	   || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)
+	   || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)) return -1;
+	*up = 	    (u<<8)|(unsigned char)i;
+	return 0;
+}
+
+int audio_init_input P0()
+{
+	unsigned long	len, enc;	/* unsigned 32 bits	*/
+
+	if (  fgetc(in) != '.' 
+	   || fgetc(in) != 's'
+	   || fgetc(in) != 'n'
+	   || fgetc(in) != 'd'
+	   || get_u32( in, &len )
+	   || get_u32( in, &enc )	/* skip this */
+	   || get_u32( in, &enc )) {
+		fprintf(stderr, 
+	"%s: bad (missing?) header in Sun audio file \"%s\";\n\
+	Try one of -u, -a, -l instead (%s -h for help).\n",
+			progname, inname ? inname : "stdin", progname);
+		return -1;
+	}
+
+	switch (enc) {
+	case 1:	input = ulaw_input;  	break;
+	case 2: input = alaw_input;  	break;
+	case 3: input = linear_input; 	break;
+	default:
+		fprintf(stderr,
+"%s: warning: file format #%lu for %s not implemented, defaulting to u-law.\n",
+			progname, enc, inname);
+		input = ulaw_input;
+		break;
+	}
+
+	while (len > 4*4)
+		if (getc(in) == EOF) {
+			fprintf(stderr, 
+			"%s: EOF in header of Sun audio file \"%s\";\n\
+			Try one of -u, -a, -l instead (%s -h for help).\n",
+				progname, inname ? inname : "stdin", progname);
+			return -1;
+		}
+		else len--;
+
+	return 0;
+}
+
+int audio_init_output P0()
+{
+	if (  fputs(".snd", out) == EOF
+	   || put_u32(out, 32)
+	   || put_u32(out, ~(unsigned long)0)
+	   || put_u32(out, 1)
+	   || put_u32(out, 8000)
+	   || put_u32(out, 1)
+	   || put_u32(out, 0)
+	   || put_u32(out, 0)) return -1;
+
+	return 0;
+}
+
diff --git a/gsm/toast_lin.c b/gsm/toast_lin.c
new file mode 100644
index 0000000000..b9f9c890e2
--- /dev/null
+++ b/gsm/toast_lin.c
@@ -0,0 +1,24 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include	"toast.h"
+
+/*  toast_linear.c -- read and write 16 bit linear sound in host byte order.
+ */
+
+extern FILE	*in, *out;
+
+int linear_input (buf) gsm_signal * buf;
+{
+	return fread( (char *)buf, sizeof(*buf), 160, in );
+}
+
+int linear_output P1((buf), gsm_signal * buf) 
+{
+	return -( fwrite( (char *)buf, sizeof(*buf), 160, out ) != 160 );
+}
diff --git a/gsm/toast_ulaw.c b/gsm/toast_ulaw.c
new file mode 100644
index 0000000000..987de11362
--- /dev/null
+++ b/gsm/toast_ulaw.c
@@ -0,0 +1,621 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/* $Header$ */
+
+#include	"toast.h"
+
+/* toast_ulaw -- functions to manipulate u-law encoded sound.
+ */
+
+extern FILE	*in, *out;
+
+#define	U2S(x)	(u2s[  (unsigned  char)(x)       ])
+#define	S2U(x)	(s2u[ ((unsigned short)(x)) >> 3 ])
+
+static unsigned short u2s[] = {
+	33280, 34308, 35336, 36364, 37393, 38421, 39449, 40477,
+	41505, 42534, 43562, 44590, 45618, 46647, 47675, 48703,
+	49474, 49988, 50503, 51017, 51531, 52045, 52559, 53073,
+	53587, 54101, 54616, 55130, 55644, 56158, 56672, 57186,
+	57572, 57829, 58086, 58343, 58600, 58857, 59114, 59371,
+	59628, 59885, 60142, 60399, 60656, 60913, 61171, 61428,
+	61620, 61749, 61877, 62006, 62134, 62263, 62392, 62520,
+	62649, 62777, 62906, 63034, 63163, 63291, 63420, 63548,
+	63645, 63709, 63773, 63838, 63902, 63966, 64030, 64095,
+	64159, 64223, 64287, 64352, 64416, 64480, 64544, 64609,
+	64657, 64689, 64721, 64753, 64785, 64818, 64850, 64882,
+	64914, 64946, 64978, 65010, 65042, 65075, 65107, 65139,
+	65163, 65179, 65195, 65211, 65227, 65243, 65259, 65275,
+	65291, 65308, 65324, 65340, 65356, 65372, 65388, 65404,
+	65416, 65424, 65432, 65440, 65448, 65456, 65464, 65472,
+	65480, 65488, 65496, 65504, 65512, 65520, 65528,     0,
+	32256, 31228, 30200, 29172, 28143, 27115, 26087, 25059,
+	24031, 23002, 21974, 20946, 19918, 18889, 17861, 16833,
+	16062, 15548, 15033, 14519, 14005, 13491, 12977, 12463,
+	11949, 11435, 10920, 10406,  9892,  9378,  8864,  8350,
+	 7964,  7707,  7450,  7193,  6936,  6679,  6422,  6165, 
+	 5908,  5651,  5394,  5137,  4880,  4623,  4365,  4108, 
+	 3916,  3787,  3659,  3530,  3402,  3273,  3144,  3016, 
+	 2887,  2759,  2630,  2502,  2373,  2245,  2116,  1988, 
+	 1891,  1827,  1763,  1698,  1634,  1570,  1506,  1441, 
+	 1377,  1313,  1249,  1184,  1120,  1056,   992,   927, 
+	  879,   847,   815,   783,   751,   718,   686,   654,
+	  622,   590,   558,   526,   494,   461,   429,   397,
+	  373,   357,   341,   325,   309,   293,   277,   261,
+	  245,   228,   212,   196,   180,   164,   148,   132,
+	  120,   112,   104,    96,    88,    80,    72,    64,
+ 	   56,    48,    40,    32,    24,    16,    8,      0
+};
+
+static unsigned char s2u[] = {
+0377,0376,0375,0374,0373,0372,0371,0370,0367,0366,0365,0364,0363,0362,0361,
+0360,0357,0357,0356,0356,0355,0355,0354,0354,0353,0353,0352,0352,0351,0351,
+0350,0350,0347,0347,0346,0346,0345,0345,0344,0344,0343,0343,0342,0342,0341,
+0341,0340,0340,0337,0337,0337,0337,0336,0336,0336,0336,0335,0335,0335,0335,
+0334,0334,0334,0334,0333,0333,0333,0333,0332,0332,0332,0332,0331,0331,0331,
+0331,0330,0330,0330,0330,0327,0327,0327,0327,0326,0326,0326,0326,0325,0325,
+0325,0325,0324,0324,0324,0324,0323,0323,0323,0323,0322,0322,0322,0322,0321,
+0321,0321,0321,0320,0320,0320,0320,0317,0317,0317,0317,0317,0317,0317,0317,
+0316,0316,0316,0316,0316,0316,0316,0316,0315,0315,0315,0315,0315,0315,0315,
+0315,0314,0314,0314,0314,0314,0314,0314,0314,0313,0313,0313,0313,0313,0313,
+0313,0313,0312,0312,0312,0312,0312,0312,0312,0312,0311,0311,0311,0311,0311,
+0311,0311,0311,0310,0310,0310,0310,0310,0310,0310,0310,0307,0307,0307,0307,
+0307,0307,0307,0307,0306,0306,0306,0306,0306,0306,0306,0306,0305,0305,0305,
+0305,0305,0305,0305,0305,0304,0304,0304,0304,0304,0304,0304,0304,0303,0303,
+0303,0303,0303,0303,0303,0303,0303,0302,0302,0302,0302,0302,0302,0302,0302,
+0301,0301,0301,0301,0301,0301,0301,0301,0300,0300,0300,0300,0300,0300,0300,
+0300,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,
+0277,0277,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,
+0276,0276,0276,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,
+0275,0275,0275,0275,0274,0274,0274,0274,0274,0274,0274,0274,0274,0274,0274,
+0274,0274,0274,0274,0274,0273,0273,0273,0273,0273,0273,0273,0273,0273,0273,
+0273,0273,0273,0273,0273,0273,0272,0272,0272,0272,0272,0272,0272,0272,0272,
+0272,0272,0272,0272,0272,0272,0272,0271,0271,0271,0271,0271,0271,0271,0271,
+0271,0271,0271,0271,0271,0271,0271,0271,0270,0270,0270,0270,0270,0270,0270,
+0270,0270,0270,0270,0270,0270,0270,0270,0270,0267,0267,0267,0267,0267,0267,
+0267,0267,0267,0267,0267,0267,0267,0267,0267,0267,0266,0266,0266,0266,0266,
+0266,0266,0266,0266,0266,0266,0266,0266,0266,0266,0266,0265,0265,0265,0265,
+0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0264,0264,0264,
+0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0263,0263,
+0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0262,
+0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,
+0262,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,
+0261,0261,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,
+0260,0260,0260,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,
+0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,
+0257,0257,0257,0257,0257,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,
+0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,
+0256,0256,0256,0256,0256,0256,0256,0255,0255,0255,0255,0255,0255,0255,0255,
+0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,
+0255,0255,0255,0255,0255,0255,0255,0255,0255,0254,0254,0254,0254,0254,0254,
+0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,
+0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0253,0253,0253,0253,
+0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,
+0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0252,0252,
+0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,
+0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,
+0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,
+0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,
+0251,0251,0251,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,
+0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,
+0250,0250,0250,0250,0250,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,
+0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,
+0247,0247,0247,0247,0247,0247,0247,0246,0246,0246,0246,0246,0246,0246,0246,
+0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,
+0246,0246,0246,0246,0246,0246,0246,0246,0246,0245,0245,0245,0245,0245,0245,
+0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,
+0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0244,0244,0244,0244,
+0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,
+0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0243,0243,
+0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,
+0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,
+0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,
+0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,
+0242,0242,0242,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,
+0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,
+0241,0241,0241,0241,0241,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,
+0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,
+0240,0240,0240,0240,0240,0240,0240,0237,0237,0237,0237,0237,0237,0237,0237,
+0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,
+0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,
+0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,
+0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0236,0236,0236,0236,
+0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,
+0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,
+0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,
+0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,
+0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,
+0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,
+0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,
+0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,
+0235,0235,0235,0235,0235,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,
+0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,
+0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,
+0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,
+0234,0234,0234,0234,0234,0234,0234,0234,0234,0233,0233,0233,0233,0233,0233,
+0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,
+0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,
+0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,
+0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0232,0232,
+0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,
+0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,
+0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,
+0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,
+0232,0232,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,
+0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,
+0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,
+0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,
+0231,0231,0231,0231,0231,0231,0231,0230,0230,0230,0230,0230,0230,0230,0230,
+0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,
+0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,
+0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,
+0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0227,0227,0227,0227,
+0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,
+0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,
+0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,
+0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,
+0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,
+0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,
+0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,
+0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,
+0226,0226,0226,0226,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,
+0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,
+0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,
+0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,
+0225,0225,0225,0225,0225,0225,0225,0225,0225,0224,0224,0224,0224,0224,0224,
+0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,
+0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,
+0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,
+0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0223,0223,
+0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,
+0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,
+0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,
+0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,
+0223,0223,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,
+0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,
+0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,
+0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,
+0222,0222,0222,0222,0222,0222,0221,0221,0221,0221,0221,0221,0221,0221,0221,
+0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,
+0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,
+0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,
+0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0220,0220,0220,0220,
+0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,
+0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,
+0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,
+0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,
+0217,0217,0217,0217,0217,0217,0217,0217,0217,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,
+0216,0216,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,
+0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,
+0214,0214,0214,0214,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,
+0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,
+0212,0212,0212,0212,0212,0212,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,
+0210,0210,0210,0210,0210,0210,0210,0210,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,
+0207,0207,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,
+0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,
+0205,0205,0205,0205,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,
+0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,
+0203,0203,0203,0203,0203,0203,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,
+0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,
+0201,0201,0201,0201,0201,0201,0201,0201,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,
+0200,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,
+0000,0000,0000,0000,0000,0000,0000,0000,0000,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,
+0001,0001,0001,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,
+0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,
+0003,0003,0003,0003,0003,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,
+0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,
+0005,0005,0005,0005,0005,0005,0005,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,
+0007,0007,0007,0007,0007,0007,0007,0007,0007,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,
+0010,0010,0010,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,
+0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,
+0012,0012,0012,0012,0012,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,
+0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,
+0014,0014,0014,0014,0014,0014,0014,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,
+0016,0016,0016,0016,0016,0016,0016,0016,0016,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,
+0017,0017,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,
+0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,
+0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,
+0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,
+0020,0020,0020,0020,0020,0020,0021,0021,0021,0021,0021,0021,0021,0021,0021,
+0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,
+0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,
+0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,
+0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0022,0022,0022,0022,
+0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,
+0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,
+0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,
+0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,
+0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,
+0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,
+0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,
+0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,
+0023,0023,0023,0023,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,
+0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,
+0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,
+0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,
+0024,0024,0024,0024,0024,0024,0024,0024,0024,0025,0025,0025,0025,0025,0025,
+0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,
+0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,
+0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,
+0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0026,0026,
+0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,
+0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,
+0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,
+0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,
+0026,0026,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,
+0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,
+0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,
+0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,
+0027,0027,0027,0027,0027,0027,0030,0030,0030,0030,0030,0030,0030,0030,0030,
+0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,
+0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,
+0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,
+0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0031,0031,0031,0031,
+0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,
+0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,
+0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,
+0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,
+0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,
+0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,
+0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,
+0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,
+0032,0032,0032,0032,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,
+0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,
+0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,
+0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,
+0033,0033,0033,0033,0033,0033,0033,0033,0034,0034,0034,0034,0034,0034,0034,
+0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,
+0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,
+0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,
+0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0035,0035,
+0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,
+0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,
+0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,
+0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,
+0035,0035,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,
+0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,
+0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,
+0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,
+0036,0036,0036,0036,0036,0036,0037,0037,0037,0037,0037,0037,0037,0037,0037,
+0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,
+0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,
+0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,
+0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0040,0040,0040,0040,0040,
+0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,
+0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0041,0041,
+0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,
+0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,
+0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,
+0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,
+0042,0042,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,
+0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,
+0043,0043,0043,0043,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,
+0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,
+0044,0044,0044,0044,0044,0044,0045,0045,0045,0045,0045,0045,0045,0045,0045,
+0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,
+0045,0045,0045,0045,0045,0045,0045,0045,0046,0046,0046,0046,0046,0046,0046,
+0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,
+0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0047,0047,0047,0047,0047,
+0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,
+0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0050,0050,
+0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,
+0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,
+0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,
+0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,
+0051,0051,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,
+0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,
+0052,0052,0052,0052,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,
+0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,
+0053,0053,0053,0053,0053,0053,0054,0054,0054,0054,0054,0054,0054,0054,0054,
+0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,
+0054,0054,0054,0054,0054,0054,0054,0054,0055,0055,0055,0055,0055,0055,0055,
+0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,
+0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0056,0056,0056,0056,0056,
+0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,
+0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0057,0057,0057,
+0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,
+0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,
+0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,
+0060,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,
+0061,0061,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,
+0062,0062,0062,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,
+0063,0063,0063,0063,0064,0064,0064,0064,0064,0064,0064,0064,0064,0064,0064,
+0064,0064,0064,0064,0064,0065,0065,0065,0065,0065,0065,0065,0065,0065,0065,
+0065,0065,0065,0065,0065,0065,0066,0066,0066,0066,0066,0066,0066,0066,0066,
+0066,0066,0066,0066,0066,0066,0066,0067,0067,0067,0067,0067,0067,0067,0067,
+0067,0067,0067,0067,0067,0067,0067,0067,0070,0070,0070,0070,0070,0070,0070,
+0070,0070,0070,0070,0070,0070,0070,0070,0070,0071,0071,0071,0071,0071,0071,
+0071,0071,0071,0071,0071,0071,0071,0071,0071,0071,0072,0072,0072,0072,0072,
+0072,0072,0072,0072,0072,0072,0072,0072,0072,0072,0072,0073,0073,0073,0073,
+0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0074,0074,0074,
+0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0075,0075,
+0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,
+0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,
+0076,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,
+0077,0077,0100,0100,0100,0100,0100,0100,0100,0100,0101,0101,0101,0101,0101,
+0101,0101,0101,0102,0102,0102,0102,0102,0102,0102,0102,0103,0103,0103,0103,
+0103,0103,0103,0103,0104,0104,0104,0104,0104,0104,0104,0104,0105,0105,0105,
+0105,0105,0105,0105,0105,0106,0106,0106,0106,0106,0106,0106,0106,0107,0107,
+0107,0107,0107,0107,0107,0107,0110,0110,0110,0110,0110,0110,0110,0110,0111,
+0111,0111,0111,0111,0111,0111,0111,0112,0112,0112,0112,0112,0112,0112,0112,
+0113,0113,0113,0113,0113,0113,0113,0113,0114,0114,0114,0114,0114,0114,0114,
+0114,0115,0115,0115,0115,0115,0115,0115,0115,0116,0116,0116,0116,0116,0116,
+0116,0116,0117,0117,0117,0117,0117,0117,0117,0117,0120,0120,0120,0120,0121,
+0121,0121,0121,0122,0122,0122,0122,0123,0123,0123,0123,0124,0124,0124,0124,
+0125,0125,0125,0125,0126,0126,0126,0126,0127,0127,0127,0127,0130,0130,0130,
+0130,0131,0131,0131,0131,0132,0132,0132,0132,0133,0133,0133,0133,0134,0134,
+0134,0134,0135,0135,0135,0135,0136,0136,0136,0136,0137,0137,0137,0137,0140,
+0140,0141,0141,0142,0142,0143,0143,0144,0144,0145,0145,0146,0146,0147,0147,
+0150,0150,0150,0151,0151,0152,0152,0153,0153,0154,0154,0155,0155,0156,0156,
+0157,0157,0160,0161,0162,0163,0164,0165,0166,0167,0170,0171,0172,0173,0174,
+0175,0176
+};
+
+int ulaw_input P1((buf), gsm_signal * buf)
+{
+	int i, c;
+
+	for (i = 0; i < 160 && (c = fgetc(in)) != EOF; i++) buf[i] = U2S(c);
+	if (c == EOF && ferror(in)) return -1;
+	return i;
+}
+
+int ulaw_output P1((buf), gsm_signal * buf)
+{
+	int i;
+
+	for(i = 0; i < 160; i++, buf++)
+		if (fputc( (char)S2U( (unsigned short)*buf ), out) == EOF)
+			return -1;
+	return 0;
+}
diff --git a/gsm/unproto.h b/gsm/unproto.h
new file mode 100644
index 0000000000..ccd565109b
--- /dev/null
+++ b/gsm/unproto.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
+ * Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
+ * details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
+ */
+
+/*$Header$*/
+
+#ifdef	PROTO_H		/* sic */
+#undef	PROTO_H
+
+#undef	P
+#undef	P0
+#undef	P1
+#undef	P2
+#undef	P3
+#undef	P4
+#undef	P5
+#undef	P6
+#undef	P7
+#undef	P8
+
+#endif	/* PROTO_H */
diff --git a/src/Makefile b/src/Makefile
index 587852ada8..fef294c710 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -17,13 +17,16 @@ SKINS = skins
 RINGS = rings
 METAL_SKINS = metal
 
-INC_OTHERS = ../stund
+ifdef ALSA
+endif
 
-INCPATH  = -I. -I$(QTDIR)/include -I$(CCPPDIR)/include/cc++2 -I$(CCRTPDIR)/include -I$(OSIPDIR)/include -I$(EXOPSIP)/include -I/usr/include
+INCPATH  = -I. -I$(QTDIR)/include -I$(CCPPDIR)/include/cc++2 -I$(CCRTPDIR)/include -I$(OSIPDIR)/include -I$(EXOPSIP)/include -I/usr/include -I../gsm
 
 CXXFLAGS = -pipe -Wall -W -g -pipe -march=i386 -mcpu=i686  -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -fpermissive -Wno-deprecated $(INCPATH)
 
-LIBS     = -L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm -L/opt/lib -losip2 -leXosip -lccrtp1 -lasound `ccgnu2-config --flags --stdlibs` 
+LIBS=-L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm -L/opt/lib -losip2 -leXosip -lccrtp1 -lasound `ccgnu2-config --flags --stdlibs` 
+
+EXTRALIBS=../gsm/libgsm.a
 
 CONFIGURE_CONF=$(shell ls ../configure.conf)
 	
@@ -61,7 +64,7 @@ OBJS = \
 	qtGUImainwindow.o qtGUImainwindow.moc.o \
 	vector.o \
 	volumecontrol.o volumecontrol.moc.o \
-	stun.o udp.o
+	stun.o udp.o  
 	
 start:	check prereq all
 
@@ -96,9 +99,9 @@ udp.o: ../stund/udp.cxx ../stund/udp.h
 	
 	
 all: $(PROGNAME)
-
-$(PROGNAME): $(OBJS) 
-	$(CXX) -o $@ $(OBJS) $(LIBS)
+	
+$(PROGNAME): $(OBJS) $(EXTRALIBS)
+	$(CXX) -o $@ $(OBJS) $(LIBS) $(EXTRALIBS)
 	
 install:	all
 	mkdir -p $(BIN_DIR)
diff --git a/src/audiocodec.cpp b/src/audiocodec.cpp
index 118dc42473..787c7058d5 100644
--- a/src/audiocodec.cpp
+++ b/src/audiocodec.cpp
@@ -17,11 +17,10 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <qapplication.h>
-
 #include "audiocodec.h"
 #include "configuration.h"
 #include "g711.h"
+#include "../gsm/gsm.h"
 
 #include <string>
 using namespace std;
@@ -95,7 +94,8 @@ AudioCodec::codecDecode (int pt, short *dst, unsigned char *src, unsigned int si
 		break;
 
 	case PAYLOAD_CODEC_GSM:
-		// TODO: 
+		gsmDecode(dst, src);
+		return 320;
 		break;
 
 	case PAYLOAD_CODEC_ILBC:
@@ -114,34 +114,60 @@ AudioCodec::codecDecode (int pt, short *dst, unsigned char *src, unsigned int si
 
 int
 AudioCodec::codecEncode (int pt, unsigned char *dst, short *src, unsigned int size) {
-		switch (pt) {
-			case PAYLOAD_CODEC_ULAW:
-				return G711::ULawEncode (dst, src, size);
-				break;
-
-			case PAYLOAD_CODEC_ALAW:
-				return G711::ALawEncode (dst, src, size);
-				break;
-
-			case PAYLOAD_CODEC_GSM:
-				// TODO
-				break;
-
-			case PAYLOAD_CODEC_ILBC:
-				// TODO
-				break;
-
-			case PAYLOAD_CODEC_SPEEX:
-				// TODO
-				break;
-
-			default:
-				break;
-		}
+	switch (pt) {
+	case PAYLOAD_CODEC_ULAW:
+		return G711::ULawEncode (dst, src, size);
+		break;
+
+	case PAYLOAD_CODEC_ALAW:
+		return G711::ALawEncode (dst, src, size);
+		break;
+
+	case PAYLOAD_CODEC_GSM:
+		gsmEncode(dst, src);
+		return 33;
+		break;
+
+	case PAYLOAD_CODEC_ILBC:
+		// TODO
+		break;
+
+	case PAYLOAD_CODEC_SPEEX:
+		// TODO
+		break;
+
+	default:
+		break;
+	}
 	return 0;
 }
 
 void
 AudioCodec::noSupportedCodec (void) {
-	qDebug("Codec no supported");
+	printf("Codec no supported\n");
+}
+
+void
+AudioCodec::gsmDecode (short *dst, unsigned char *src) {
+	gsm gsmhandle;
+
+	if (!(gsmhandle = gsm_create() )) 
+		printf("AudioCodec: ERROR: gsm_create\n");
+	
+	if (gsm_decode(gsmhandle, src, dst) < 0) 
+		printf("AudioCodec: ERROR: gsm_decode\n");
+
+	gsm_destroy(gsmhandle);
+}
+
+void
+AudioCodec::gsmEncode (unsigned char* dst, short* src) {
+	gsm gsmhandle;
+
+	if (!(gsmhandle = gsm_create() )) 
+		printf("AudioCodec: ERROR: gsm_create\n");
+	
+	gsm_encode(gsmhandle, src, dst); 
+
+	gsm_destroy(gsmhandle);
 }
diff --git a/src/audiocodec.h b/src/audiocodec.h
index 815dfab68d..e5849e56ec 100644
--- a/src/audiocodec.h
+++ b/src/audiocodec.h
@@ -39,6 +39,7 @@ typedef enum {
 
 #define NB_CODECS			5
 
+
 class AudioCodec {
 public:
 	AudioCodec 				(void);		
@@ -46,11 +47,14 @@ public:
 
 	int 	handleCodecs[NB_CODECS];
 
+
 	void 		noSupportedCodec	(void);
 	static int	codecDecode 		(int, short *, unsigned char *, unsigned int);
 	static int	codecEncode 		(int, unsigned char *, short *, unsigned int);
 	int			matchPayloadCodec	(string);
 	char *		rtpmapPayload 		(int);
+	static void		gsmDecode			(short*, unsigned char*);
+	static void		gsmEncode			(unsigned char*, short*);
 
 private:
 	
diff --git a/src/audiortp.cpp b/src/audiortp.cpp
index ad14dfc7d5..29537022ff 100644
--- a/src/audiortp.cpp
+++ b/src/audiortp.cpp
@@ -38,12 +38,12 @@
 using namespace ost;
 using namespace std;
 
+
 ////////////////////////////////////////////////////////////////////////////////
 // AudioRtp                                                          
 ////////////////////////////////////////////////////////////////////////////////
-AudioRtp::AudioRtp (SIP *sip, Manager *manager) {
+AudioRtp::AudioRtp (Manager *manager) {
 	string svr;
-	this->sip = sip;
 	this->manager = manager;
 	RTXThread = NULL;
 	if (!manager->useStun()) {
@@ -162,6 +162,7 @@ AudioRtpRTX::run (void) {
 					 timestamp;
 	int				 expandedSize;
 	short			*data_for_speakers = NULL;
+	int 			 countTime = 0;
 	
 	data_for_speakers = new short[2048];
 	data_from_mic = new short[1024];
@@ -253,7 +254,7 @@ AudioRtpRTX::run (void) {
 	} else {
 		session->startRunning();
 	}
-	
+
 	while (ca->enable_audio != -1) {
 		////////////////////////////
 		// Send session
@@ -287,7 +288,7 @@ AudioRtpRTX::run (void) {
 
 		// Encode acquired audio sample
 		compSize = AudioCodec::codecEncode (
-				ac.handleCodecs[0], 
+				ca->payload, 
 				data_to_send,
 				data_from_mic_tmp, i);
 
@@ -319,11 +320,21 @@ AudioRtpRTX::run (void) {
 				data_for_speakers,
 				(unsigned char*) adu->getData(),
 				adu->getSize());
-		
-		// Write decoded data to sound device
+
+		// Set decoded data to sound device
 		audioDevice->audio_buf.resize(expandedSize);
 		audioDevice->audio_buf.setData (data_for_speakers, 
 				manager->getSpkrVolume());
+
+		// Notify (with a bip) an incoming call when there is already call 
+		countTime += TimerPort::getElapsed();
+		if (manager->sip->getNumberPendingCalls() != 1) {
+			if ((countTime % 4000) <= 10 and (countTime % 4000) >= 0) {
+				manager->notificationIncomingCall();
+			}
+		}
+		
+		// Write data or notification
 		i = audioDevice->writeBuffer ();
 		delete adu;
 
diff --git a/src/audiortp.h b/src/audiortp.h
index 6400d2048c..551461f36e 100644
--- a/src/audiortp.h
+++ b/src/audiortp.h
@@ -60,7 +60,7 @@ private:
 ///////////////////////////////////////////////////////////////////////////////
 class AudioRtp {
 public:
-	AudioRtp (SIP *, Manager *);
+	AudioRtp (Manager *);
 	~AudioRtp (void);
 
 	int 				createNewSession	(SipCall *);
diff --git a/src/configurationpanel.ui b/src/configurationpanel.ui
index 4767d283cc..379fb0cc25 100644
--- a/src/configurationpanel.ui
+++ b/src/configurationpanel.ui
@@ -757,6 +757,11 @@
                                                             <string>G711a</string>
                                                         </property>
                                                     </item>
+                                                    <item>
+                                                        <property name="text">
+                                                            <string>GSM</string>
+                                                        </property>
+                                                    </item>
                                                     <property name="name">
                                                         <cstring>codec1</cstring>
                                                     </property>
@@ -772,6 +777,11 @@
                                                             <string>G711u</string>
                                                         </property>
                                                     </item>
+                                                    <item>
+                                                        <property name="text">
+                                                            <string>GSM</string>
+                                                        </property>
+                                                    </item>
                                                     <property name="name">
                                                         <cstring>codec2</cstring>
                                                     </property>
@@ -787,6 +797,11 @@
                                                             <string>G711a</string>
                                                         </property>
                                                     </item>
+                                                    <item>
+                                                        <property name="text">
+                                                            <string>GSM</string>
+                                                        </property>
+                                                    </item>
                                                     <property name="name">
                                                         <cstring>codec3</cstring>
                                                     </property>
@@ -802,6 +817,11 @@
                                                             <string>G711a</string>
                                                         </property>
                                                     </item>
+                                                    <item>
+                                                        <property name="text">
+                                                            <string>GSM</string>
+                                                        </property>
+                                                    </item>
                                                     <property name="name">
                                                         <cstring>codec4</cstring>
                                                     </property>
@@ -817,6 +837,11 @@
                                                             <string>G711a</string>
                                                         </property>
                                                     </item>
+                                                    <item>
+                                                        <property name="text">
+                                                            <string>GSM</string>
+                                                        </property>
+                                                    </item>
                                                     <property name="name">
                                                         <cstring>codec5</cstring>
                                                     </property>
@@ -1230,7 +1255,7 @@ Montreal, Quebec H2T 1S6&lt;/p&gt;</string>
 </widget>
 <images>
     <image name="image0">
-        <data format="PNG" length="3612">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade00000de349444154789ced5d5f685bd71dfe69a4e00e3394b18724946197b5600f4aafe73ec85b4baedb97ca4e49a57650bbeb831467c4de5eeab42f493c52350fa9a34286d5e1ce0a84d82d183b0f8eec419895a1221792591e1e7220057b78432ea638c618d998c0b787ab7b75ff9c73efb9574aea343a2f9fe57bfefcced1ef7cf73bbf7bce1581884688a86a0800ab0000644b883da0eaedd4f089c58a1d3475af00009086674117003a3fc145790ce8bf9907007cdf1dafe1e38b9e0ae6d71502f5c753a065802e4cb8467f01884ca1e6c035748dee0a0090af3a33aa5b94c780c256b126216a28844219b1a730a217467583b14cbee6b8357444c70cf9f522a4647599d50ea5e1d99a64a8a12dda66c03ae02f3c7c8635a33f9eaa396e0db9c8bd905f2fc21ff7c09889142809d0f02c280904afcf03002696942883683dfe8b13953b2e80a1e111444ef522d2d35bc20822a77a31181f0400140a85c7479200484d55774217b78a188c03919e5e048eca88f444bcd7ff10ec63617518f6a26228b6609bb2cb78248c8b22807b4053ab8442eb069a5a2548ad01eee733e7638f05b39f391fd3ecaf9abd1958c6a3ff837e4f13f9a1d8c740ebccdb836b8615499199794f1ad70be3464ef51abe8860670843c3230080d1b109200ec89d41edbad41ac07c6e7eff33ae6a7fb51c024687955a0388f4f456c4b455b58f83967fc870a941379c1d36309ead48e3ca57b3e20e0523c322c71f40dc53ec4bcda46ceb57f355ea20155db7b3afe0c13e0081a3b2e50e847587f17a04f639e5f78d1051948892441405e0fb6892e84098e8811846a41c255f6f215e8afe2d4757165a84ebe3e1e8b135ea7ee1882fa9b79781b9dc3c4e9cfc03edd22ed5511d05e4364a0cc61dcb191040b8ab9b56be59d1ead163500e525f4f941a9f7fd6d77654c6eef62ed5d5d7d1dcad34257d3e9fbebe74268bb3036769737b93a4a6266abff6854fb5b3e5cb166abbd34ebbdbbb86faa5a626925e94e8f4fba78df5c581e62f5ba88eeae8d2a797a8fd955ffb12c32348fe35a995f71f3a489bdfdea75ddaa5a53b398b3d2aaa76b3faa79503d07eac43ab4f9fafaebe8ee6e434adf5acd1e123a5ef45c0bebafa3aadbffa76129f2769e6c60cad7cbb6268c77fe820a5df9ca69db777e8e99ffcd89724d3ccf3f284cb2eb9d5b04e4fd084f630c0aad1829d21601dc866b242335e2d1f382a2b1d29316dff07fd1a23055e938122507caddc5eb03368b5efb8f5fa607cc86a5f06889cea35d467d68606462c96fecfd0a4eae733e763fcf1025bf32307a0a88cb3c13e409150a571d0f21fafd03e13e3e33894ffaf03a177ba8ce35d627a8d69a353f3b8f26f0f8cf8b334e1643b9365fb88e83397cc6d87b181301de6308799299b5f6ab1308899299a9a9aa8fd37edd4dd1536321280dc428e5a5a7e6561e8e656097a464a7c9e243d934c4f4d9699c764c7d29d1c4ddf98a6731f5da05dda257fbd9ffa7afaa8bbfb2d9f9dfd2a23255a0350db89f644a9eff7277cd19e5e2c2c2c5898baebed2eea78a3d337363681ee7f8529ba19253a50472d2fb650dfc9a8c670fa7642c742d4f8a773cee3502dfb8e7550f4641fa9d78372909a062f18bedfb3e76398b93143bbb44b819702d4f697cf7c8a86d8ab2c1eabee45b0a4f5ea31adeb680280c1f81030231645d09881519fca30c1ce90a13c72d098c2c230a4aca62d8c74bc6ccfe8f8049f09ef95194a5dcd33edcd9834bca91facfeaaed22076b7f6cc655ed6fb03368a84f5dc4bab50ff78ced87dee932303a32b07c7f00a030ad072dabc7c04098e6985c4b74e9eb15fae05663559856d1b62bd4fdc2b3ee342a11ad150a387cf830a5bf9aa3f66fda28fc77ab66d56bacbe0f4fd3c29d1c6d6e6f72195bcd7f3f0e5c29693955dbae7cb342dd27a35af9d8c019ea78a3d367666a9ee64c67b238fdfe698d91a3ffb8c561b2081616ee6a76f5fdf36b0b53ad7dbb46f480880e10d5d53f4d894f2e3199d6628fcb71706d9fc01d518ffe7a3fcd4e4d2b1e2f0d57ce88766970ae7a8c5bb06144b7989a491918636478047a86d3346d69353b3a3ec1641814c065704d1396da659577d29c6a7911cde8a6fff3b979667fcc0ca96a5afd38b018daad7de6f645e3e53f5adb2a62e13b22ba36494461cf3879778dc3b544a7034413bb6b0a6356d8ce91c1498a0270d2b4b9dc3c9cf275bcde41afd2abda4cbebf1da5e62e2363267d3e1f1df1f9923e9faffbb76ff9ba0fbdabe56f915a28494474c4e70b1e0b521dd519ea533f4fbf3959663ee9ac76fd8b2faf73ef0ce1aeee72f99794f2fafa13d792ca5ae45a9fa13d3777a016a9c560afda9f2880e6f7957108d78769fac6a4711cde0e1bfa471279b2cfdcfec70367b9779eb54201ea6702aac08089595ba6d552e98959a5ed8d2eda682f58e3b4a3e3a53b4151816c266b605455732263a3f1605c35b3aeb334b31a65b0b3cf10ff0463d55c283399a366b46128964665f5477f070abc261b19d8649f6b4d6bb663bd7c5dbdb369f61595ef4c5d3368d18388d7a8818afe69426f07976579c9f7799ae8bb764fedf60f84a989332377b68a38d1778216eede15d64a5253137d7cee636a7cae91ccf159ffa183b4bbbdc3d474160d781e68be61d468aab633df0978f14f3d361e6aa4a14f2f51e3f38a864f1e95a1dac1d28c8d871a2994baee1c5d21b6a6d46bfa36d9183f161987eb9d21a87156967daa3637dba15f13f0c6a3f1b9469afc624c61fc6205cc172a6d86f19acea4f31e9f90d930ad8e1106e383e0c5093103b6864289994b7153641486054aabda2214edab32b79eb94a7b1ed47283f1415b3b53332943fe72b921ab5d6a7e9d3daabd6ab96cc6c593435d7fd5fe30ffafb34b1d2f35966b2ee7649fed9347467b9153bd0abb668ce34c9ef6bd5e2eefdaaa34659737400977edfbe3fb7f734b0d1f1e92a72881c36e2ed7690bd8804b3b6c3aa69eb4e8bf09c8281fa6ac9d0afe61a038d35e14dbcd556912b5c7ae630d1ce69692953374b13421b2abca4e21663eddf5ecea4655274a9133f1d4f662993c62289d92ae427b43b797114169d31280fcbab13fa97b05c863ca7505671183f7337ff9f50dc460ac2f64aa4f8c69138fc45fb55429d37a2d278285a2f5ce637658de1daa220742796f88340ca396de02b3bfd95554d4dfa1dbd67afd05b1fed272e90ee7a27f219bdd80faf17366da47c4b0e65409d37a2d27746b32d5673e8c191acf72ed96c7001e538a301eb71f9cf18aa1b2fec638f5ea1da8b807c863fcf1163af307a0e1728a3b6ee6f28e4cfb30527e5dd1b0a92507c7dd874cebc4a04efb91a56269af86dbf6c1ef477695cdb4b18c87767418cbb86070f07709daee19b129d7906097233b0f0f54df5fcb0ea93b5336086083b1b80b816d979336fd3e9956e4bd10feb87bad1bcbe45d332dd751dc4c1437f5c2fe4d430d89b2e6eebf99076fed4117ecdf44c48fd316c08d1284ae035454a4032d0374d583d36e30da2d897d2d6d01b46ecd171ac7be655a37716fdb277b2c07e2f4035ca6adec3d12b10c3b8e0e07adcc636811f4179cebb7cc601583a60707fde93ce8327fe6b9765ade8c3469e8d075ebd932b3a3ec2fa6e56b5a1646a6c4cea67961da47a16979985ddd707dd6504a8a697edbd5aee6608959db19e2a44d994e5be4d76769dfe5aa783f695aa908a4f467cca038ba7eff72685ce04405f8fdd8179a96816e4e75376c40388ece65a6b2c3f235ef43615a93a636e7f35f7476bcfda46979cc51dc336a76a75576ffcdc740d30a966761c365f10dfe04220a8d5b67140090c8993181d3b84ca775605a9178dd7e645abda6153a450c6b7dd8d2393a0056bcd4c068fb4cd3aa76bb3d7328fa4aacca4f2e3c334778af8ddc26afbbbcb2bfbb4f6d3fffa9edc9851317005ef9c21f77e870e954a79b930f2aface4f405f5fece5253afbca2fb5fadaaf6671eb7f6d440f2649fe4598babbc5ceb41dfc6492361f888fc3c819e30903d6f7277ca68e837701c419f56220ccddf7bab3073cfd1491577ff21f98a4fb1ff2eb379cc66d60ade60599ef5131add0ee2e227ba61598c9d5d2b4a2f67a61267df93ce72c9eabf619d89060dbc3d5b0ab809d1f49c3ca771fcb28e12c5efd746142d9fabcc5b65ffb6374b120a43d9ca20cc24eebb21d375acaa99e081cf60ed84d08179a561e73ff020d9137aab3b4392fdeee552244a6d86f0462463ba0c455eda202bcb8f4d0ed656e94c11f07866e2f5bca9171c03dbc09a6e8c16397d9cc6087b20b07f372c7b09bf129ddc982aa6b5aa6c3388f8f1ba696d538bac3ea5cdd1dc76340a6e6b4c92f7a67c31620d9dc7955fb8d9a96bcbf6146d5386e92dbf721f8ebc3b4d423ae45ed34ad575435a493a6d5bf3f4258d332706c7119efdee09f6236685addf7d7f8e769facf7607b79cfccc1c1d7caf8da4af96885e6e26fa6a89d2ff6da6cded342dd8ac31e467d2947eaf5dd39a3b7bc0b9a788589a57549b9a710ec01581fa1c57b32278269d7745b44251091dba7a7244a5f0509598d6bc0a37c76159cca35eefbfe9ce6e9646643190343c6b5befe82260de8de61501fe5e033e330ac49d796873c750ed61168cc0a5e6bca89c4010496edf9e28fac4c88ce67daf5e9137b04ed7abfa1b1266bb5c941b5d5c36ec4fe5695f697816f298f2a043db8f6be378a38bca3e5aff45a5bc7c358b10aab48f178a9695c7cabff1d17039a5fd360757dbd8690c266e28efeeb24b6edf7fe05513d6f0878db64ce5e5b71678871da53177cfe4851e6dd6f08944e78ca89e361445af92a0864f068a654459bb7889af8aa23fae68b0fd303035dcbf285ea024e61f16c3ca00f709480d6ba847d705b2ab1bb66782dc6245e1911a3e91e8bd022871482f7b16d4b33f3566ada117ac4e4500461795b85e683c6b39071f42799344ed37706b5829fe1fab8c941d3590b5ea0000000049454e44ae426082</data>
+        <data format="PNG" length="3612">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade00000de349444154789ced5d5f685bd71dfe69a4e00e3394b28724946197b5600fcaaee73ec85d4baee94b65a7a4525b68bcf5418a33626f7ba8ddbee4cf48d5305247850cabc39d951266b760ec3c24b2076656868b5c48667978c88114ece10db998a21863142302df1eaeeed5fd73cebde75e29a9d3e8bc7c96ef3de7fcced1ef7ce73bbf7bce1581884689a8660800eb000064ca881250f37aeaf8d862d50e9aba930700482373a0f3009d9be4a23c0e0ccce60000df75c3ebf8e8a2a78cb94d8540fdf114681da0f393aed1bf0944aea1eec075748dee320090af3833aa5b94c781fc76b12e21ea28844237a2a430a217467583b1f95cdd71ebe8888e37e4368b9092b565563b9446e6ea92a18eb6687b033601ffe683675833fae3a9bae3d6918bdc0bb9cd22fc710f8c99488192008dcc819240f0ea220060724589328896e3bf3059bde302181e1945e4641f22bd7d658c2072b20f43f12100403e9f7f74240980d4b5da0ee8e27611437120d2db87c0611991de88f7f21f807d2cac0dc35e500cc5366c5366150f85715104b00ab4b44b28b417d1d22e416a0f703f9f3a177b2498fdd4b998667fcdec5d80a53f06de1bf034901f887d0cb48ebc125c33ac488acc2c7ad2b85e183772b2cff04504bb43181e1905008c8d4f027140ee0e6ad7a5f60016b38b7b9f7155fb6be510303aacd41e40a4b7af2aa6ada97d1cb4fc43864b0deac0ae001098c854a571e52b197187829161b1ccef40dc51ec4bcda46ccb57efabd641aaba6e675fde837d00028765cb0c8482437f3d04fb9ceef78d1251948892441405e0fb608a685f98e8be1846a42c255f6d235e8afe2d4b9797da84cbe3e1d8910dea79fe902fa9b79781d9ec228e9ff82dedd22e35500305e40e4a0cc51df3191040f8580fad7dbda695a3c7a01ca4fede28353ff78cafe3b08cdd9d5d6a686ca0851b694afa7c3e7d79e9f90c4e9f3d4d5b3b5b24b5b450e75f3ff7a976b67dd1461db73a697767d750bed4d242d2cf251a7c77d0585e1c68fda28d1aa8812e7e7c913a5f7ed197181945f22f492dbfffc07edafae62eedd22eaddcca5aec5151b59bd53e2d1f80ce235d5a79fafb1a1a1b68414ed346ef061d3c54fe5e04ec6b686cd0daabaf27f1699266aecfd0da376b867afc07f653faf569baf7e63d7af2473ff425c934f2bc3ce1b24b6e35acd31334a13d0cb06ab4607708280099f98cd08857f3070ecb4a43ca4c3bf0de80c648815764a008e0954a7dc1eea0d5bea3d6eb43f161ab7d0b40e4649fa13cb336343062a9fc7f8626553f9f3a17e3f717d89a1fcb50daa5ab2fd81d0200454295fb41bbff6895f699181f47a1fcbf0084de3e66ecef32d36b4c1bbdb688cbfff6c0883f4e134e743259b69f883e71c9dc76183b1ba6831ce6303365eb0b6d16063133454b4b0b75feb2937a8e858d8c0420bb94a5b6b65f5818bab55d829e91129f2649cf24d3d7a62acc63b263e55696a6af4fd3990fced32eed92bfd14ffdbdfdd4d3f386cfce7e959112ed01a8f5447ba3d4ff9be3be686f1f9696962c4c7deccd63d4f55ab76f7c7c123dff0a53742b4ab4af81da7ede46fd27a21ac3e9eb091d0951f31fce38f743adec3bd245d113fda45e0fca416a193a6ff87e4f9f8b61e6fa0cedd22e055e0850c79f3ff1291aa2545d3c56dd8b60499bb5635ad7d1040043f16160562c8aa03103a33c956182dd21437e64a13185856148594d5b18e968c59eb189493e13ae56184a5dcd33ed5d306978533b58ed55eb4516d6f6d8f4abdade6077d0509eba88756b1fee18eb0fbd7dccc0e89887e5fb030085693d68593d06ce866981c9b54417bf5aa3f76e34d78469156dbb463dcf3fe34ea312d1463e8f83070f52facb05eafcba83c27fb76a56bdc6ea7f7f90966e65696b678bcbd8eafd77e3c0e5b29653b5eddad76bd47322aae58f9d3d455daf75fbcc4ccdd39ce9f90c06df1dd41839fa8f1b1c268b6069e9b66657ff3fbfb230d5c6371b44f789681f5143e39394f8e82293692df6b8ec07d7f609cc887af437fa69eedab4e2f1d248f58c689786166ac7b8051b46748ba999948131464746a167384dd39657b36313934c86411e5c06d73461b95e567e27cda9e617d18c6edabf985d64b6c7cc90aaa6d5f7038ba1ddda67ae5f345efe838ded2296be25a2cfa68828ec19a76e6f70b89668304034b9b3a1306695f53cf5c7298a0270d2b4d9ec229ceeeb7ab58b5ea417b5917c77274aad6f191933e9f3f9e890cf97f4f97c3d6fbde10b1f7843bbbf4d6aa32411d1219f2f7824480dd460284ffd3cfdfa9456efa034a85dfffc8babdc99217caca792ff0525bfbefcc46749652df259bfa13e3733509bd466b0576d4f1440ebef957ee86aeca2e9eb53c67e78336c681f49e4c93e73fd1f9e3dcd9d7936f279a89f09a8010326e66c99564be5986eb5f58d2ddb682f58e3b46313e599a0a840663e636054557362de46e3c1b86a665d6769662dca60639f21fe09c6aa395f613247cd68c3502c8dca6a8f7e060abc221b19d8649f6b4d6bb6a350b9aece6c9a7d4500a5ca9a418b1e44bc460d54f44f13fabab82ccb4bbe4fd344df767aaa77e06c985a3823f2de7611c7fb8fd3d2eddbc25a496a69a10fcf7c48cdcf3693393eeb3fb09f7677ee31359d45039e035aaf1b359aaaedcc33012ffea9c7e603cd34fcf1456a7e4ed1f0c9c332543b589ab1f940338552579da32bc4d6947a4ddf211be3c722fd70b53b0435cecab24fd5e6663bf46b025e7f343fdb4c539f8f2b8c5f0df385ca9b61bca653e99cc72764364cab6384a1f810787142cc82ada1506666356ebaa0302c505ed596a0685f95b9f5cc55def3a0e61b8a0fd9da999a4919eeafe41bb6daa5deafb347b557cd979977f1e450d75eb53dccffebec52fb0b5918fa41d43edb278f8cfa2227fb8055285104ddfde469dfeba5caaead6a5366b5004ab8abdf1fdffb9b5beaf8e0903c450904f61bb84adb65d27263874dc3d4931603b3808cca61cafaa9e0ef078a33ed05b1dd5cd526517bec1ad6c4616e29593d4317cb0322b35e00c0294f773db35ea8e9402972069e5a5f6c3e8718caa7a46b50dff0cd554450deb40420b7696c4fea4e1ef2b8725dc139c4e0fdcc5f6eb380188ce5854ce589316de2a1f8ab96aa655aaff944b050b2ce3c6687e5cd505539102a7b43a41118b5f43698edcdaca3aaf60edfb496ebdf146b2fad97673817ed0bd9ec06d4f79f33d33e248635a76a98d66b3ea1a9c9549ef930666822c3b55b1e07784c29c278dc7670fa2b86eada1be394ab77a0620990c7f9fd2d74e60f40d3a514b7dfccf91d99f641a4dca6a261532b0e8ebb0799d689419df6234ba5f25e0db7f583df8ecc3a9b6963f31eead1616cde058383bf4bd076cf884dbea6043b1fd97978a0f6fe5a7148dd99b2210005c6e22e04b65d4edaf4bb645a91f742f8e3eeb56e6c3ee79a69b98ee266a0b82917f66f1a6a4a5434f7c06c0ebcb5079db77f13115f936c821b25085d05a8a448075a07e88a07a7dd66d45b16fb5ada06a860bd2f34813dcbb4dcfe74fb648fe5409c7680cbb4d5bd472236cf8ea3c3412bf3185a04fd9bcee55b46b08a41d3838381740e74893ff25c3b2d6f449a3474e8aaf56c99c551cc8ef59d322d5fd3b230724dec6c9a17a67d189a968799f582ebb38652524cf3dbae7635074bccd98e10276dca74da12bf3c4bfd2e57c57b49d34a2520a53f6306c5d1f5fb97431302272ac06fc79ed0b40c7473aabb691bc271742e33551c96af791f08d39a34b5f93eff0567c7db4b9a96c71cc59251b33badb207661f014d2b989f854d97c437f813882834611d5100402267c63c3e1d73625a9178dd5e645aa0725de81431ace5615be7e80058f15203a3ed314dabdaedf6cca1e82bb1aa3fb9f0f402e19d0e729bbceef2cafcfa2e75fce429db930bc7cf03bcfcf9dfdda383e5539d6e4e3ea8e83b37097d79b19756e8f4cb3fd3caebbc92c18dff7510dd9f22f9a761eae9113bd3b6ffa329daba2fde0fa3a78c270c58df9ff0993a0ede061067948bb361eebed77b25e0c92788bcfa937fdf14dd7d9f5fbee1346e136b352fc87c0f8b6985767711d933adc048ae95a615b5d70b33e9f3e73867f15cd5cfc0a604db1eae865d07ecfc481a51befbd8bc12cee295cf9c71f4dfaffac7d8725e487b384519849dd6653d6eb49453391138ec1db01b102e34ad3ceefe051a226f546769735ebcddab44885c63bf118819ed801257b58b0af0e2d2c33757b951067f1c18beb96ac947c60ef7f0269892078ff5f03e04d98583799931ec467c4a77b2a0e69a96e930cefde386a965358eeeb03a5777c7f11890a9396dee179dd9b00d483633af6abf51d392f737cca81ac74d72fb3e047f6398567ac5b5a89da6f58aaa8674d2b4faf747086b5a068e2fafe257d7f9a7980d9a56f7fd35ff699afeb3d3c5cd273fbd40fbdfe920e9cb15a2975a89be5ca1f47f5b696b274d4b366b0cf9e934a5dfe9d4b4e6bd1270e6092296e615d5a6665c007059a03cc7d5ac089e4ae75c11ad50544287ae9e1c51393c5423a635afc2cd71583ba61d987567374b23b218481a99b32d776c1930ef46ab66a6e1ed35e033a340dc99873633866a0f3363042e35e705e504824872fbf644d127466634ef7bf58abc8e75ba5ed3df9030dbe522dfd8f2aa617f2a4ffb4a237390c795071dda7e5c1bc71b5b56f6d1fa2f28f9e52b198450a37dbc50b4ac3c5ef98d8fa64b29edb739b8dac64e6330715b7977975d72fbfe03af9ab08edf6fb4652a2fbfb5c03bec288dbb7b262ff468b38e8f253adf88da694351f42a09eaf878a0d88da868172ff15551f4c7150db6173aa68e7b17c53394c5fc83625819e03e01a9631df5e83a4366bd607b26c82d56151ea9e36389de0b801287f4b267413dfb5367d63a7ac1da1404606c5989eb8526329673f021543649d47f03b78ed5e2ff01a9e39f669eee93e00000000049454e44ae426082</data>
     </image>
 </images>
 <connections>
diff --git a/src/configurationpanelui.cpp b/src/configurationpanelui.cpp
index a348bce7e3..28935be1ef 100644
--- a/src/configurationpanelui.cpp
+++ b/src/configurationpanelui.cpp
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form implementation generated from reading ui file 'configurationpanel.ui'
 **
-** Created: Mon Feb 7 11:33:42 2005
+** Created: Thu Feb 10 12:16:26 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
@@ -35,302 +35,302 @@ static const unsigned char image0_data[] = {
     0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x30,
     0x08, 0x06, 0x00, 0x00, 0x00, 0x63, 0x57, 0xfa, 0xde, 0x00, 0x00, 0x0d,
     0xe3, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x5d, 0x5f, 0x68, 0x5b,
-    0xd7, 0x1d, 0xfe, 0x69, 0xa4, 0xe0, 0x0e, 0x33, 0x94, 0xb1, 0x87, 0x24,
-    0x94, 0x61, 0x97, 0xb5, 0x60, 0x0f, 0x4a, 0xaf, 0xe7, 0x3e, 0xc8, 0x5b,
-    0x4b, 0xae, 0xdb, 0x97, 0xca, 0x4e, 0x49, 0xa5, 0x76, 0x50, 0xbb, 0xeb,
-    0x83, 0x14, 0x67, 0xc4, 0xde, 0x5e, 0xea, 0xb4, 0x2f, 0x49, 0x3c, 0x52,
-    0x35, 0x0f, 0xa9, 0xa3, 0x42, 0x86, 0xd5, 0xe1, 0xce, 0x0a, 0x84, 0xd8,
-    0x2d, 0x18, 0x3b, 0x0f, 0x8e, 0xec, 0x41, 0x98, 0x95, 0xa1, 0x22, 0x17,
-    0x92, 0x59, 0x1e, 0x1e, 0x72, 0x20, 0x05, 0x7b, 0x78, 0x43, 0x2e, 0xa6,
-    0x38, 0xc6, 0x18, 0xd9, 0x98, 0xc0, 0xb7, 0x87, 0xab, 0x7b, 0x75, 0xff,
-    0x9c, 0x73, 0xef, 0xb9, 0x57, 0x4a, 0xea, 0x34, 0x3a, 0x2f, 0x9f, 0xe5,
-    0x7b, 0xfe, 0xfc, 0xce, 0xd1, 0xef, 0x7c, 0xf7, 0x3b, 0xbf, 0x7b, 0xce,
-    0x15, 0x81, 0x88, 0x46, 0x88, 0xa8, 0x6a, 0x08, 0x00, 0xab, 0x00, 0x00,
-    0x64, 0x4b, 0x88, 0x3d, 0xa0, 0xea, 0xed, 0xd4, 0xf0, 0x89, 0xc5, 0x8a,
-    0x1d, 0x34, 0x75, 0xaf, 0x00, 0x00, 0x90, 0x86, 0x67, 0x41, 0x17, 0x00,
-    0x3a, 0x3f, 0xc1, 0x45, 0x79, 0x0c, 0xe8, 0xbf, 0x99, 0x07, 0x00, 0x7c,
-    0xdf, 0x1d, 0xaf, 0xe1, 0xe3, 0x8b, 0x9e, 0x0a, 0xe6, 0xd7, 0x15, 0x02,
-    0xf5, 0xc7, 0x53, 0xa0, 0x65, 0x80, 0x2e, 0x4c, 0xb8, 0x46, 0x7f, 0x01,
-    0x88, 0x4c, 0xa1, 0xe6, 0xc0, 0x35, 0x74, 0x8d, 0xee, 0x0a, 0x00, 0x90,
-    0xaf, 0x3a, 0x33, 0xaa, 0x5b, 0x94, 0xc7, 0x80, 0xc2, 0x56, 0xb1, 0x26,
-    0x21, 0x6a, 0x28, 0x84, 0x42, 0x19, 0xb1, 0xa7, 0x30, 0xa2, 0x17, 0x46,
-    0x75, 0x83, 0xb1, 0x4c, 0xbe, 0xe6, 0xb8, 0x35, 0x74, 0x44, 0xc7, 0x0c,
-    0xf9, 0xf5, 0x22, 0xa4, 0x64, 0x75, 0x99, 0xd5, 0x0e, 0xa5, 0xe1, 0xd9,
-    0x9a, 0x64, 0xa8, 0xa1, 0x2d, 0xda, 0x66, 0xc0, 0x3a, 0xe0, 0x2f, 0x3c,
-    0x7c, 0x86, 0x35, 0xa3, 0x3f, 0x9e, 0xaa, 0x39, 0x6e, 0x0d, 0xb9, 0xc8,
-    0xbd, 0x90, 0x5f, 0x2f, 0xc2, 0x1f, 0xf7, 0xc0, 0x98, 0x89, 0x14, 0x28,
-    0x09, 0xd0, 0xf0, 0x2c, 0x28, 0x09, 0x04, 0xaf, 0xcf, 0x03, 0x00, 0x26,
-    0x96, 0x94, 0x28, 0x83, 0x68, 0x3d, 0xfe, 0x8b, 0x13, 0x95, 0x3b, 0x2e,
-    0x80, 0xa1, 0xe1, 0x11, 0x44, 0x4e, 0xf5, 0x22, 0xd2, 0xd3, 0x5b, 0xc2,
-    0x08, 0x22, 0xa7, 0x7a, 0x31, 0x18, 0x1f, 0x04, 0x00, 0x14, 0x0a, 0x85,
-    0xc7, 0x47, 0x92, 0x00, 0x48, 0x4d, 0x55, 0x77, 0x42, 0x17, 0xb7, 0x8a,
-    0x18, 0x8c, 0x03, 0x91, 0x9e, 0x5e, 0x04, 0x8e, 0xca, 0x88, 0xf4, 0x44,
-    0xbc, 0xd7, 0xff, 0x10, 0xec, 0x63, 0x61, 0x75, 0x18, 0xf6, 0xa2, 0x62,
-    0x28, 0xb6, 0x60, 0x9b, 0xb2, 0xcb, 0x78, 0x24, 0x8c, 0x8b, 0x22, 0x80,
-    0x7b, 0x40, 0x53, 0xab, 0x84, 0x42, 0xeb, 0x06, 0x9a, 0x5a, 0x25, 0x48,
-    0xad, 0x01, 0xee, 0xe7, 0x33, 0xe7, 0x63, 0x8f, 0x05, 0xb3, 0x9f, 0x39,
-    0x1f, 0xd3, 0xec, 0xaf, 0x9a, 0xbd, 0x19, 0x58, 0xc6, 0xa3, 0xff, 0x83,
-    0x7e, 0x4f, 0x13, 0xf9, 0xa1, 0xd8, 0xc7, 0x40, 0xeb, 0xcc, 0xdb, 0x83,
-    0x6b, 0x86, 0x15, 0x49, 0x91, 0x99, 0x79, 0x4f, 0x1a, 0xd7, 0x0b, 0xe3,
-    0x46, 0x4e, 0xf5, 0x1a, 0xbe, 0x88, 0x60, 0x67, 0x08, 0x43, 0xc3, 0x23,
-    0x00, 0x80, 0xd1, 0xb1, 0x09, 0x20, 0x0e, 0xc8, 0x9d, 0x41, 0xed, 0xba,
-    0xd4, 0x1a, 0xc0, 0x7c, 0x6e, 0x7e, 0xff, 0x33, 0xae, 0x6a, 0x7f, 0xb5,
-    0x1c, 0x02, 0x46, 0x87, 0x95, 0x5a, 0x03, 0x88, 0xf4, 0xf4, 0x56, 0xc4,
-    0xb4, 0x55, 0xb5, 0x8f, 0x83, 0x96, 0x7f, 0xc8, 0x70, 0xa9, 0x41, 0x37,
-    0x9c, 0x1d, 0x36, 0x30, 0x9e, 0xad, 0x48, 0xe3, 0xca, 0x57, 0xb3, 0xe2,
-    0x0e, 0x05, 0x23, 0xc3, 0x22, 0xc7, 0x1f, 0x40, 0xdc, 0x53, 0xec, 0x4b,
-    0xcd, 0xa4, 0x6c, 0xeb, 0x57, 0xf3, 0x55, 0xea, 0x20, 0x15, 0x5d, 0xb7,
-    0xb3, 0xaf, 0xe0, 0xc1, 0x3e, 0x00, 0x81, 0xa3, 0xb2, 0xe5, 0x0e, 0x84,
-    0x75, 0x87, 0xf1, 0x7a, 0x04, 0xf6, 0x39, 0xe5, 0xf7, 0x8d, 0x10, 0x51,
-    0x94, 0x88, 0x92, 0x44, 0x14, 0x05, 0xe0, 0xfb, 0x68, 0x92, 0xe8, 0x40,
-    0x98, 0xe8, 0x81, 0x18, 0x46, 0xa4, 0x1c, 0x25, 0x5f, 0x6f, 0x21, 0x5e,
-    0x8a, 0xfe, 0x2d, 0x47, 0x57, 0x16, 0x5a, 0x84, 0xeb, 0xe3, 0xe1, 0xe8,
-    0xb1, 0x35, 0xea, 0x7e, 0xe1, 0x88, 0x2f, 0xa9, 0xb7, 0x97, 0x81, 0xb9,
-    0xdc, 0x3c, 0x4e, 0x9c, 0xfc, 0x03, 0xed, 0xd2, 0x2e, 0xd5, 0x51, 0x1d,
-    0x05, 0xe4, 0x36, 0x4a, 0x0c, 0xc6, 0x1d, 0xcb, 0x19, 0x10, 0x40, 0xb8,
-    0xab, 0x9b, 0x56, 0xbe, 0x59, 0xd1, 0xea, 0xd1, 0x63, 0x50, 0x0e, 0x52,
-    0x5f, 0x4f, 0x94, 0x1a, 0x9f, 0x7f, 0xd6, 0xd7, 0x76, 0x54, 0xc6, 0xee,
-    0xf6, 0x2e, 0xd5, 0xd5, 0xd7, 0xd1, 0xdc, 0xad, 0x34, 0x25, 0x7d, 0x3e,
-    0x9f, 0xbe, 0xbe, 0x74, 0x26, 0x8b, 0xb3, 0x03, 0x67, 0x69, 0x73, 0x7b,
-    0x93, 0xa4, 0xa6, 0x26, 0x6a, 0xbf, 0xf6, 0x85, 0x4f, 0xb5, 0xb3, 0xe5,
-    0xcb, 0x16, 0x6a, 0xbb, 0xd3, 0x4e, 0xbb, 0xdb, 0xbb, 0x86, 0xfa, 0xa5,
-    0xa6, 0x26, 0x92, 0x5e, 0x94, 0xe8, 0xf4, 0xfb, 0xa7, 0x8d, 0xf5, 0xc5,
-    0x81, 0xe6, 0x2f, 0x5b, 0xa8, 0x8e, 0xea, 0xe8, 0xd2, 0xa7, 0x97, 0xa8,
-    0xfd, 0x95, 0x5f, 0xfb, 0x12, 0xc3, 0x23, 0x48, 0xfe, 0x35, 0xa9, 0x95,
-    0xf7, 0x1f, 0x3a, 0x48, 0x9b, 0xdf, 0xde, 0xa7, 0x5d, 0xda, 0xa5, 0xa5,
-    0x3b, 0x39, 0x8b, 0x3d, 0x2a, 0xaa, 0x76, 0xb3, 0xfa, 0xa7, 0x95, 0x03,
-    0xd0, 0x7e, 0xac, 0x43, 0xab, 0x4f, 0x9f, 0xaf, 0xae, 0xbe, 0x8e, 0xe6,
-    0xe4, 0x34, 0xad, 0xf5, 0xac, 0xd1, 0xe1, 0x23, 0xa5, 0xef, 0x45, 0xc0,
-    0xbe, 0xba, 0xfa, 0x3a, 0xad, 0xbf, 0xfa, 0x76, 0x12, 0x9f, 0x27, 0x69,
-    0xe6, 0xc6, 0x0c, 0xad, 0x7c, 0xbb, 0x62, 0x68, 0xc7, 0x7f, 0xe8, 0x20,
-    0xa5, 0xdf, 0x9c, 0xa6, 0x9d, 0xb7, 0x77, 0xe8, 0xe9, 0x9f, 0xfc, 0xd8,
-    0x97, 0x24, 0xd3, 0xcc, 0xf3, 0xf2, 0x84, 0xcb, 0x2e, 0xb9, 0xd5, 0xb0,
-    0x4e, 0x4f, 0xd0, 0x84, 0xf6, 0x30, 0xc0, 0xaa, 0xd1, 0x82, 0x9d, 0x21,
-    0x60, 0x1d, 0xc8, 0x66, 0xb2, 0x42, 0x33, 0x5e, 0x2d, 0x1f, 0x38, 0x2a,
-    0x2b, 0x1d, 0x29, 0x31, 0x6d, 0xff, 0x07, 0xfd, 0x1a, 0x23, 0x05, 0x5e,
-    0x93, 0x81, 0x22, 0x50, 0x7c, 0xad, 0xdc, 0x5e, 0xb0, 0x33, 0x68, 0xb5,
-    0xef, 0xb8, 0xf5, 0xfa, 0x60, 0x7c, 0xc8, 0x6a, 0x5f, 0x06, 0x88, 0x9c,
-    0xea, 0x35, 0xd4, 0x67, 0xd6, 0x86, 0x06, 0x46, 0x2c, 0x96, 0xfe, 0xcf,
-    0xd0, 0xa4, 0xea, 0xe7, 0x33, 0xe7, 0x63, 0xfc, 0xf1, 0x02, 0x5b, 0xf3,
-    0x23, 0x07, 0xa0, 0xa8, 0x8c, 0xb3, 0xc1, 0x3e, 0x40, 0x91, 0x50, 0xa5,
-    0x71, 0xd0, 0xf2, 0x1f, 0xaf, 0xd0, 0x3e, 0x13, 0xe3, 0xe3, 0x38, 0x94,
-    0xff, 0xaf, 0x03, 0xa1, 0x77, 0xba, 0x8c, 0xe3, 0x5d, 0x62, 0x7a, 0x8d,
-    0x69, 0xa3, 0x53, 0xf3, 0xb8, 0xf2, 0x6f, 0x0f, 0x8c, 0xf8, 0xb3, 0x34,
-    0xe1, 0x64, 0x3b, 0x93, 0x65, 0xfb, 0x88, 0xe8, 0x33, 0x97, 0xcc, 0x6d,
-    0x87, 0xb1, 0x81, 0x30, 0x1d, 0xe6, 0x30, 0x87, 0x99, 0x29, 0x9b, 0x5f,
-    0x6a, 0xb1, 0x30, 0x88, 0x99, 0x29, 0x9a, 0x9a, 0x9a, 0xa8, 0xfd, 0x37,
-    0xed, 0xd4, 0xdd, 0x15, 0x36, 0x32, 0x12, 0x80, 0xdc, 0x42, 0x8e, 0x5a,
-    0x5a, 0x7e, 0x65, 0x61, 0xe8, 0xe6, 0x56, 0x09, 0x7a, 0x46, 0x4a, 0x7c,
-    0x9e, 0x24, 0x3d, 0x93, 0x4c, 0x4f, 0x4d, 0x96, 0x99, 0xc7, 0x64, 0xc7,
-    0xd2, 0x9d, 0x1c, 0x4d, 0xdf, 0x98, 0xa6, 0x73, 0x1f, 0x5d, 0xa0, 0x5d,
-    0xda, 0x25, 0x7f, 0xbd, 0x9f, 0xfa, 0x7a, 0xfa, 0xa8, 0xbb, 0xfb, 0x2d,
-    0x9f, 0x9d, 0xfd, 0x2a, 0x23, 0x25, 0x5a, 0x03, 0x50, 0xdb, 0x89, 0xf6,
-    0x44, 0xa9, 0xef, 0xf7, 0x27, 0x7c, 0xd1, 0x9e, 0x5e, 0x2c, 0x2c, 0x2c,
-    0x58, 0x98, 0xba, 0xeb, 0xed, 0x2e, 0xea, 0x78, 0xa3, 0xd3, 0x37, 0x36,
-    0x36, 0x81, 0xee, 0x7f, 0x85, 0x29, 0xba, 0x19, 0x25, 0x3a, 0x50, 0x47,
-    0x2d, 0x2f, 0xb6, 0x50, 0xdf, 0xc9, 0xa8, 0xc6, 0x70, 0xfa, 0x76, 0x42,
-    0xc7, 0x42, 0xd4, 0xf8, 0xa7, 0x73, 0xce, 0xe3, 0x50, 0x2d, 0xfb, 0x8e,
-    0x75, 0x50, 0xf4, 0x64, 0x1f, 0xa9, 0xd7, 0x83, 0x72, 0x90, 0x9a, 0x06,
-    0x2f, 0x18, 0xbe, 0xdf, 0xb3, 0xe7, 0x63, 0x98, 0xb9, 0x31, 0x43, 0xbb,
-    0xb4, 0x4b, 0x81, 0x97, 0x02, 0xd4, 0xf6, 0x97, 0xcf, 0x7c, 0x8a, 0x86,
-    0xd8, 0xab, 0x2c, 0x1e, 0xab, 0xee, 0x45, 0xb0, 0xa4, 0xf5, 0xea, 0x31,
-    0xad, 0xeb, 0x68, 0x02, 0x80, 0xc1, 0xf8, 0x10, 0x30, 0x23, 0x16, 0x45,
-    0xd0, 0x98, 0x81, 0x51, 0x9f, 0xca, 0x30, 0xc1, 0xce, 0x90, 0xa1, 0x3c,
-    0x72, 0xd0, 0x98, 0xc2, 0xc2, 0x30, 0xa4, 0xac, 0xa6, 0x2d, 0x8c, 0x74,
-    0xbc, 0x6c, 0xcf, 0xe8, 0xf8, 0x04, 0x9f, 0x09, 0xef, 0x95, 0x19, 0x4a,
-    0x5d, 0xcd, 0x33, 0xed, 0xcd, 0x98, 0x34, 0xbc, 0xa9, 0x1f, 0xac, 0xfe,
-    0xaa, 0xed, 0x22, 0x07, 0x6b, 0x7f, 0x6c, 0xc6, 0x55, 0xed, 0x6f, 0xb0,
-    0x33, 0x68, 0xa8, 0x4f, 0x5d, 0xc4, 0xba, 0xb5, 0x0f, 0xf7, 0x8c, 0xed,
-    0x87, 0xde, 0xe9, 0x32, 0x30, 0x3a, 0x32, 0xb0, 0x7c, 0x7f, 0x00, 0xa0,
-    0x30, 0xad, 0x07, 0x2d, 0xab, 0xc7, 0xc0, 0x40, 0x98, 0xe6, 0x98, 0x5c,
-    0x4b, 0x74, 0xe9, 0xeb, 0x15, 0xfa, 0xe0, 0x56, 0x63, 0x55, 0x98, 0x56,
-    0xd1, 0xb6, 0x2b, 0xd4, 0xfd, 0xc2, 0xb3, 0xee, 0x34, 0x2a, 0x11, 0xad,
-    0x15, 0x0a, 0x38, 0x7c, 0xf8, 0x30, 0xa5, 0xbf, 0x9a, 0xa3, 0xf6, 0x6f,
-    0xda, 0x28, 0xfc, 0x77, 0xab, 0x66, 0xd5, 0x6b, 0xac, 0xbe, 0x0f, 0x4f,
-    0xd3, 0xc2, 0x9d, 0x1c, 0x6d, 0x6e, 0x6f, 0x72, 0x19, 0x5b, 0xcd, 0x7f,
-    0x3f, 0x0e, 0x5c, 0x29, 0x69, 0x39, 0x55, 0xdb, 0xae, 0x7c, 0xb3, 0x42,
-    0xdd, 0x27, 0xa3, 0x5a, 0xf9, 0xd8, 0xc0, 0x19, 0xea, 0x78, 0xa3, 0xd3,
-    0x67, 0x66, 0x6a, 0x9e, 0xe6, 0x4c, 0x67, 0xb2, 0x38, 0xfd, 0xfe, 0x69,
-    0x8d, 0x91, 0xa3, 0xff, 0xb8, 0xc5, 0x61, 0xb2, 0x08, 0x16, 0x16, 0xee,
-    0x6a, 0x76, 0xf5, 0xfd, 0xf3, 0x6b, 0x0b, 0x53, 0xad, 0x7d, 0xbb, 0x46,
-    0xf4, 0x80, 0x88, 0x0e, 0x10, 0xd5, 0xd5, 0x3f, 0x4d, 0x89, 0x4f, 0x2e,
-    0x31, 0x99, 0xd6, 0x62, 0x8f, 0xcb, 0x71, 0x70, 0x6d, 0x9f, 0xc0, 0x1d,
-    0x51, 0x8f, 0xfe, 0x7a, 0x3f, 0xcd, 0x4e, 0x4d, 0x2b, 0x1e, 0x2f, 0x0d,
-    0x57, 0xce, 0x88, 0x76, 0x69, 0x70, 0xae, 0x7a, 0x8c, 0x5b, 0xb0, 0x61,
-    0x44, 0xb7, 0x98, 0x9a, 0x49, 0x19, 0x18, 0x63, 0x64, 0x78, 0x04, 0x7a,
-    0x86, 0xd3, 0x34, 0x6d, 0x69, 0x35, 0x3b, 0x3a, 0x3e, 0xc1, 0x64, 0x18,
-    0x14, 0xc0, 0x65, 0x70, 0x4d, 0x13, 0x96, 0xda, 0x65, 0x95, 0x77, 0xd2,
-    0x9c, 0x6a, 0x79, 0x11, 0xcd, 0xe8, 0xa6, 0xff, 0xf3, 0xb9, 0x79, 0x66,
-    0x7f, 0xcc, 0x0c, 0xa9, 0x6a, 0x5a, 0xfd, 0x38, 0xb0, 0x18, 0xda, 0xad,
-    0x7d, 0xe6, 0xf6, 0x45, 0xe3, 0xe5, 0x3f, 0x5a, 0xdb, 0x2a, 0x62, 0xe1,
-    0x3b, 0x22, 0xba, 0x36, 0x49, 0x44, 0x61, 0xcf, 0x38, 0x79, 0x77, 0x8d,
-    0xc3, 0xb5, 0x44, 0xa7, 0x03, 0x44, 0x13, 0xbb, 0x6b, 0x0a, 0x63, 0x56,
-    0xd8, 0xce, 0x91, 0xc1, 0x49, 0x8a, 0x02, 0x70, 0xd2, 0xb4, 0xb9, 0xdc,
-    0x3c, 0x9c, 0xf2, 0x75, 0xbc, 0xde, 0x41, 0xaf, 0xd2, 0xab, 0xda, 0x4c,
-    0xbe, 0xbf, 0x1d, 0xa5, 0xe6, 0x2e, 0x23, 0x63, 0x26, 0x7d, 0x3e, 0x1f,
-    0x1d, 0xf1, 0xf9, 0x92, 0x3e, 0x9f, 0xaf, 0xfb, 0xb7, 0x6f, 0xf9, 0xba,
-    0x0f, 0xbd, 0xab, 0xe5, 0x6f, 0x91, 0x5a, 0x28, 0x49, 0x44, 0x74, 0xc4,
-    0xe7, 0x0b, 0x1e, 0x0b, 0x52, 0x1d, 0xd5, 0x19, 0xea, 0x53, 0x3f, 0x4f,
-    0xbf, 0x39, 0x59, 0x66, 0x3e, 0xe9, 0xac, 0x76, 0xfd, 0x8b, 0x2f, 0xaf,
-    0x73, 0xef, 0x0c, 0xe1, 0xae, 0xee, 0x72, 0xf9, 0x97, 0x94, 0xf2, 0xfa,
-    0xfa, 0x13, 0xd7, 0x92, 0xca, 0x5a, 0xe4, 0x5a, 0x9f, 0xa1, 0x3d, 0x37,
-    0x77, 0xa0, 0x16, 0xa9, 0xc5, 0x60, 0xaf, 0xda, 0x9f, 0x28, 0x80, 0xe6,
-    0xf7, 0x95, 0x71, 0x08, 0xd7, 0x87, 0x69, 0xfa, 0xc6, 0xa4, 0x71, 0x1c,
-    0xde, 0x0e, 0x1b, 0xfa, 0x47, 0x12, 0x79, 0xb2, 0xcf, 0xdc, 0xfe, 0xc7,
-    0x03, 0x67, 0xb9, 0x77, 0x9e, 0xb5, 0x42, 0x01, 0xea, 0x67, 0x02, 0xaa,
-    0xc0, 0x80, 0x89, 0x59, 0x5b, 0xa6, 0xd5, 0x52, 0xe9, 0x89, 0x59, 0xa5,
-    0xed, 0x8d, 0x2e, 0xda, 0x68, 0x2f, 0x58, 0xe3, 0xb4, 0xa3, 0xe3, 0xa5,
-    0x3b, 0x41, 0x51, 0x81, 0x6c, 0x26, 0x6b, 0x60, 0x54, 0x55, 0x73, 0x22,
-    0x63, 0xa3, 0xf1, 0x60, 0x5c, 0x35, 0xb3, 0xae, 0xb3, 0x34, 0xb3, 0x1a,
-    0x65, 0xb0, 0xb3, 0xcf, 0x10, 0xff, 0x04, 0x63, 0xd5, 0x5c, 0x28, 0x33,
-    0x99, 0xa3, 0x66, 0xb4, 0x61, 0x28, 0x96, 0x46, 0x65, 0xf5, 0x47, 0x7f,
-    0x07, 0x0a, 0xbc, 0x26, 0x1b, 0x19, 0xd8, 0x64, 0x9f, 0x6b, 0x4d, 0x6b,
-    0xb6, 0x63, 0xbd, 0x7c, 0x5d, 0xbd, 0xb3, 0x69, 0xf6, 0x15, 0x95, 0xef,
-    0x4c, 0x5d, 0x33, 0x68, 0xd1, 0x83, 0x88, 0xd7, 0xa8, 0x81, 0x8a, 0xfe,
-    0x69, 0x42, 0x6f, 0x07, 0x97, 0x65, 0x79, 0xc9, 0xf7, 0x79, 0x9a, 0xe8,
-    0xbb, 0x76, 0x4f, 0xed, 0xf6, 0x0f, 0x84, 0xa9, 0x89, 0x33, 0x23, 0x77,
-    0xb6, 0x8a, 0x38, 0xd1, 0x77, 0x82, 0x16, 0xee, 0xde, 0x15, 0xd6, 0x4a,
-    0x52, 0x53, 0x13, 0x7d, 0x7c, 0xee, 0x63, 0x6a, 0x7c, 0xae, 0x91, 0xcc,
-    0xf1, 0x59, 0xff, 0xa1, 0x83, 0xb4, 0xbb, 0xbd, 0xc3, 0xd4, 0x74, 0x16,
-    0x0d, 0x78, 0x1e, 0x68, 0xbe, 0x61, 0xd4, 0x68, 0xaa, 0xb6, 0x33, 0xdf,
-    0x09, 0x78, 0xf1, 0x4f, 0x3d, 0x36, 0x1e, 0x6a, 0xa4, 0xa1, 0x4f, 0x2f,
-    0x51, 0xe3, 0xf3, 0x8a, 0x86, 0x4f, 0x1e, 0x95, 0xa1, 0xda, 0xc1, 0xd2,
-    0x8c, 0x8d, 0x87, 0x1a, 0x29, 0x94, 0xba, 0xee, 0x1c, 0x5d, 0x21, 0xb6,
-    0xa6, 0xd4, 0x6b, 0xfa, 0x36, 0xd9, 0x18, 0x3f, 0x16, 0x19, 0x87, 0xeb,
-    0x9d, 0x21, 0xa8, 0x71, 0x56, 0x96, 0x7d, 0xaa, 0x36, 0x37, 0xdb, 0xa1,
-    0x5f, 0x13, 0xf0, 0xc6, 0xa3, 0xf1, 0xb9, 0x46, 0x9a, 0xfc, 0x62, 0x4c,
-    0x61, 0xfc, 0x62, 0x05, 0xcc, 0x17, 0x2a, 0x6d, 0x86, 0xf1, 0x9a, 0xce,
-    0xa4, 0xf3, 0x1e, 0x9f, 0x90, 0xd9, 0x30, 0xad, 0x8e, 0x11, 0x06, 0xe3,
-    0x83, 0xe0, 0xc5, 0x09, 0x31, 0x03, 0xb6, 0x86, 0x42, 0x89, 0x99, 0x4b,
-    0x71, 0x53, 0x64, 0x14, 0x86, 0x05, 0x4a, 0xab, 0xda, 0x22, 0x14, 0xed,
-    0xab, 0x32, 0xb7, 0x9e, 0xb9, 0x4a, 0x7b, 0x1e, 0xd4, 0x72, 0x83, 0xf1,
-    0x41, 0x5b, 0x3b, 0x53, 0x33, 0x29, 0x43, 0xfe, 0x72, 0xb9, 0x21, 0xab,
-    0x5d, 0x6a, 0x7e, 0x9d, 0x3d, 0xaa, 0xbd, 0x6a, 0xb9, 0x6c, 0xc6, 0xc5,
-    0x93, 0x43, 0x5d, 0x7f, 0xd5, 0xfe, 0x30, 0xff, 0xaf, 0xb3, 0x4b, 0x1d,
-    0x2f, 0x35, 0x96, 0x6b, 0x2e, 0xe7, 0x64, 0x9f, 0xed, 0x93, 0x47, 0x46,
-    0x7b, 0x91, 0x53, 0xbd, 0x0a, 0xbb, 0x66, 0x8c, 0xe3, 0x4c, 0x9e, 0xf6,
-    0xbd, 0x5e, 0x2e, 0xef, 0xda, 0xaa, 0x34, 0x65, 0x97, 0x37, 0x40, 0x09,
-    0x77, 0xed, 0xfb, 0xe3, 0xfb, 0x7f, 0x73, 0x4b, 0x0d, 0x1f, 0x1e, 0x92,
-    0xa7, 0x28, 0x81, 0xc3, 0x6e, 0x2e, 0xd7, 0x69, 0x0b, 0xd8, 0x80, 0x4b,
-    0x3b, 0x6c, 0x3a, 0xa6, 0x9e, 0xb4, 0xe8, 0xbf, 0x09, 0xc8, 0x28, 0x1f,
-    0xa6, 0xac, 0x9d, 0x0a, 0xfe, 0x61, 0xa0, 0x38, 0xd3, 0x5e, 0x14, 0xdb,
-    0xcd, 0x55, 0x69, 0x12, 0xb5, 0xc7, 0xae, 0x63, 0x0d, 0x1c, 0xe6, 0x96,
-    0x92, 0x95, 0x33, 0x74, 0xb1, 0x34, 0x21, 0xb2, 0xab, 0xca, 0x4e, 0x21,
-    0x66, 0x3e, 0xdd, 0xf5, 0xec, 0xea, 0x46, 0x55, 0x27, 0x4a, 0x91, 0x33,
-    0xf1, 0xd4, 0xf6, 0x62, 0x99, 0x3c, 0x62, 0x28, 0x9d, 0x92, 0xae, 0x42,
-    0x7b, 0x43, 0xb7, 0x97, 0x11, 0x41, 0x69, 0xd3, 0x12, 0x80, 0xfc, 0xba,
-    0xb1, 0x3f, 0xa9, 0x7b, 0x05, 0xc8, 0x63, 0xca, 0x75, 0x05, 0x67, 0x11,
-    0x83, 0xf7, 0x33, 0x7f, 0xf9, 0xf5, 0x0d, 0xc4, 0x60, 0xac, 0x2f, 0x64,
-    0xaa, 0x4f, 0x8c, 0x69, 0x13, 0x8f, 0xc4, 0x5f, 0xb5, 0x54, 0x29, 0xd3,
-    0x7a, 0x2d, 0x27, 0x82, 0x85, 0xa2, 0xf5, 0xce, 0x63, 0x76, 0x58, 0xde,
-    0x1d, 0xaa, 0x22, 0x07, 0x42, 0x79, 0x6f, 0x88, 0x34, 0x0c, 0xa3, 0x96,
-    0xde, 0x02, 0xb3, 0xbf, 0xd9, 0x55, 0x54, 0xd4, 0xdf, 0xa1, 0xdb, 0xd6,
-    0x7a, 0xfd, 0x05, 0xb1, 0xfe, 0xd2, 0x72, 0xe9, 0x0e, 0xe7, 0xa2, 0x7f,
-    0x21, 0x9b, 0xdd, 0x80, 0xfa, 0xf1, 0x73, 0x66, 0xda, 0x47, 0xc4, 0xb0,
-    0xe6, 0x54, 0x09, 0xd3, 0x7a, 0x2d, 0x27, 0x74, 0x6b, 0x32, 0xd5, 0x67,
-    0x3e, 0x8c, 0x19, 0x1a, 0xcf, 0x72, 0xed, 0x96, 0xc7, 0x00, 0x1e, 0x53,
-    0x8a, 0x30, 0x1e, 0xb7, 0x1f, 0x9c, 0xf1, 0x8a, 0xa1, 0xb2, 0xfe, 0xc6,
-    0x38, 0xf5, 0xea, 0x1d, 0xa8, 0xb8, 0x07, 0xc8, 0x63, 0xfc, 0xf1, 0x16,
-    0x3a, 0xf3, 0x07, 0xa0, 0xe1, 0x72, 0x8a, 0x3b, 0x6e, 0xe6, 0xf2, 0x8e,
-    0x4c, 0xfb, 0x30, 0x52, 0x7e, 0x5d, 0xd1, 0xb0, 0xa9, 0x25, 0x07, 0xc7,
-    0xdd, 0x87, 0x4c, 0xeb, 0xc4, 0xa0, 0x4e, 0xfb, 0x91, 0xa5, 0x62, 0x69,
-    0xaf, 0x86, 0xdb, 0xf6, 0xc1, 0xef, 0x47, 0x76, 0x95, 0xcd, 0xb4, 0xb1,
-    0x8c, 0x87, 0x76, 0x74, 0x18, 0xcb, 0xb8, 0x60, 0x70, 0xf0, 0x77, 0x09,
-    0xda, 0xee, 0x19, 0xb1, 0x29, 0xd7, 0x90, 0x60, 0x97, 0x23, 0x3b, 0x0f,
-    0x0f, 0x54, 0xdf, 0x5f, 0xcb, 0x0e, 0xa9, 0x3b, 0x53, 0x36, 0x08, 0x60,
-    0x83, 0xb1, 0xb8, 0x0b, 0x81, 0x6d, 0x97, 0x93, 0x36, 0xfd, 0x3e, 0x99,
-    0x56, 0xe4, 0xbd, 0x10, 0xfe, 0xb8, 0x7b, 0xad, 0x1b, 0xcb, 0xe4, 0x5d,
-    0x33, 0x2d, 0xd7, 0x51, 0xdc, 0x4c, 0x14, 0x37, 0xf5, 0xc2, 0xfe, 0x4d,
-    0x43, 0x0d, 0x89, 0xb2, 0xe6, 0xee, 0xbf, 0x99, 0x07, 0x6f, 0xed, 0x41,
-    0x17, 0xec, 0xdf, 0x44, 0xc4, 0x8f, 0xd3, 0x16, 0xc0, 0x8d, 0x12, 0x84,
-    0xae, 0x03, 0x54, 0x54, 0xa4, 0x03, 0x2d, 0x03, 0x74, 0xd5, 0x83, 0xd3,
-    0x6e, 0x30, 0xda, 0x2d, 0x89, 0x7d, 0x2d, 0x6d, 0x01, 0xb4, 0x6e, 0xcd,
-    0x17, 0x1a, 0xc7, 0xbe, 0x65, 0x5a, 0x37, 0x71, 0x6f, 0xdb, 0x27, 0x7b,
-    0x2c, 0x07, 0xe2, 0xf4, 0x03, 0x5c, 0xa6, 0xad, 0xec, 0x3d, 0x12, 0xb1,
-    0x0c, 0x3b, 0x8e, 0x0e, 0x07, 0xad, 0xcc, 0x63, 0x68, 0x11, 0xf4, 0x17,
-    0x9c, 0xeb, 0xb7, 0xcc, 0x60, 0x15, 0x83, 0xa6, 0x07, 0x07, 0xfd, 0xe9,
-    0x3c, 0xe8, 0x32, 0x7f, 0xe6, 0xb9, 0x76, 0x5a, 0xde, 0x8c, 0x34, 0x69,
-    0xe8, 0xd0, 0x75, 0xeb, 0xd9, 0x32, 0xb3, 0xa3, 0xec, 0x2f, 0xa6, 0xe5,
-    0x6b, 0x5a, 0x16, 0x46, 0xa6, 0xc4, 0xce, 0xa6, 0x79, 0x61, 0xda, 0x47,
-    0xa1, 0x69, 0x79, 0x98, 0x5d, 0xdd, 0x70, 0x7d, 0xd6, 0x50, 0x4a, 0x8a,
-    0x69, 0x7e, 0xdb, 0xd5, 0xae, 0xe6, 0x60, 0x89, 0x59, 0xdb, 0x19, 0xe2,
-    0xa4, 0x4d, 0x99, 0x4e, 0x5b, 0xe4, 0xd7, 0x67, 0x69, 0xdf, 0xe5, 0xaa,
-    0x78, 0x3f, 0x69, 0x5a, 0xa9, 0x08, 0xa4, 0xf4, 0x67, 0xcc, 0xa0, 0x38,
-    0xba, 0x7e, 0xff, 0x72, 0x68, 0x5c, 0xe0, 0x44, 0x05, 0xf8, 0xfd, 0xd8,
-    0x17, 0x9a, 0x96, 0x81, 0x6e, 0x4e, 0x75, 0x37, 0x6c, 0x40, 0x38, 0x8e,
-    0xce, 0x65, 0xa6, 0xb2, 0xc3, 0xf2, 0x35, 0xef, 0x43, 0x61, 0x5a, 0x93,
-    0xa6, 0x36, 0xe7, 0xf3, 0x5f, 0x74, 0x76, 0xbc, 0xfd, 0xa4, 0x69, 0x79,
-    0xcc, 0x51, 0xdc, 0x33, 0x6a, 0x76, 0xa7, 0x55, 0x76, 0xff, 0xcd, 0xc7,
-    0x40, 0xd3, 0x0a, 0x96, 0x67, 0x61, 0xc3, 0x65, 0xf1, 0x0d, 0xfe, 0x04,
-    0x22, 0x0a, 0x8d, 0x5b, 0x67, 0x14, 0x00, 0x90, 0xc8, 0x99, 0x31, 0x81,
-    0xd3, 0xb8, 0x4c, 0xa7, 0x75, 0x60, 0x5a, 0x91, 0x78, 0xdd, 0x7e, 0x64,
-    0x5a, 0xbd, 0xa6, 0x15, 0x3a, 0x45, 0x0c, 0x6b, 0x7d, 0xd8, 0xd2, 0x39,
-    0x3a, 0x00, 0x56, 0xbc, 0xd4, 0xc0, 0x68, 0xfb, 0x4c, 0xd3, 0xaa, 0x76,
-    0xbb, 0x3d, 0x73, 0x28, 0xfa, 0x4a, 0xac, 0xca, 0x4f, 0x2e, 0x3c, 0x33,
-    0x47, 0x78, 0xaf, 0x8d, 0xdc, 0x26, 0xaf, 0xbb, 0xbc, 0xb2, 0xbf, 0xbb,
-    0x4f, 0x6d, 0x3f, 0xff, 0xa9, 0xed, 0xc9, 0x85, 0x13, 0x17, 0x00, 0x5e,
-    0xf9, 0xc2, 0x1f, 0x77, 0xe8, 0x70, 0xe9, 0x54, 0xa7, 0x9b, 0x93, 0x0f,
-    0x2a, 0xfa, 0xce, 0x4f, 0x40, 0x5f, 0x5f, 0xec, 0xe5, 0x25, 0x3a, 0xfb,
-    0xca, 0x2f, 0xb5, 0xfa, 0xda, 0xaf, 0x66, 0x71, 0xeb, 0x7f, 0x6d, 0x44,
-    0x0f, 0x26, 0x49, 0xfe, 0x45, 0x98, 0xba, 0xbb, 0xc5, 0xce, 0xb4, 0x1d,
-    0xfc, 0x64, 0x92, 0x36, 0x1f, 0x88, 0x8f, 0xc3, 0xc8, 0x19, 0xe3, 0x09,
-    0x03, 0xd6, 0xf7, 0x27, 0x7c, 0xa6, 0x8e, 0x83, 0x77, 0x01, 0xc4, 0x19,
-    0xf5, 0x62, 0x20, 0xcc, 0xdd, 0xf7, 0xba, 0xb3, 0x07, 0x3c, 0xfd, 0x14,
-    0x91, 0x57, 0x7f, 0xf2, 0x1f, 0x98, 0xa4, 0xfb, 0x1f, 0xf2, 0xeb, 0x37,
-    0x9c, 0xc6, 0x6d, 0x60, 0xad, 0xe6, 0x05, 0x99, 0xef, 0x51, 0x31, 0xad,
-    0xd0, 0xee, 0x2e, 0x22, 0x7b, 0xa6, 0x15, 0x98, 0xc9, 0xd5, 0xd2, 0xb4,
-    0xa2, 0xf6, 0x7a, 0x61, 0x26, 0x7d, 0xf9, 0x3c, 0xe7, 0x2c, 0x9e, 0xab,
-    0xf6, 0x19, 0xd8, 0x90, 0x60, 0xdb, 0xc3, 0xd5, 0xb0, 0xab, 0x80, 0x9d,
-    0x1f, 0x49, 0xc3, 0xca, 0x77, 0x1f, 0xcb, 0x28, 0xe1, 0x2c, 0x5e, 0xfd,
-    0x74, 0x61, 0x42, 0xd9, 0xfa, 0xbc, 0xc5, 0xb6, 0x5f, 0xfb, 0x63, 0x74,
-    0xb1, 0x20, 0xa4, 0x3d, 0x9c, 0xa2, 0x0c, 0xc2, 0x4e, 0xeb, 0xb2, 0x1d,
-    0x37, 0x5a, 0xca, 0xa9, 0x9e, 0x08, 0x1c, 0xf6, 0x0e, 0xd8, 0x4d, 0x08,
-    0x17, 0x9a, 0x56, 0x1e, 0x73, 0xff, 0x02, 0x0d, 0x91, 0x37, 0xaa, 0xb3,
-    0xb4, 0x39, 0x2f, 0xde, 0xee, 0x55, 0x22, 0x44, 0xa6, 0xd8, 0x6f, 0x04,
-    0x62, 0x46, 0x3b, 0xa0, 0xc4, 0x55, 0xed, 0xa2, 0x02, 0xbc, 0xb8, 0xf4,
-    0xd0, 0xed, 0x65, 0x6e, 0x94, 0xc1, 0x1f, 0x07, 0x86, 0x6e, 0x2f, 0x5b,
-    0xca, 0x91, 0x71, 0xc0, 0x3d, 0xbc, 0x09, 0xa6, 0xe8, 0xc1, 0x63, 0x97,
-    0xd9, 0xcc, 0x60, 0x87, 0xb2, 0x0b, 0x07, 0xf3, 0x72, 0xc7, 0xb0, 0x9b,
-    0xf1, 0x29, 0xdd, 0xc9, 0x82, 0xaa, 0x6b, 0x5a, 0xa6, 0xc3, 0x38, 0x8f,
-    0x8f, 0x1b, 0xa6, 0x96, 0xd5, 0x38, 0xba, 0xc3, 0xea, 0x5c, 0xdd, 0x1d,
-    0xc7, 0x63, 0x40, 0xa6, 0xe6, 0xb4, 0xc9, 0x2f, 0x7a, 0x67, 0xc3, 0x16,
-    0x20, 0xd9, 0xdc, 0x79, 0x55, 0xfb, 0x8d, 0x9a, 0x96, 0xbc, 0xbf, 0x61,
-    0x46, 0xd5, 0x38, 0x6e, 0x92, 0xdb, 0xf7, 0x21, 0xf8, 0xeb, 0xc3, 0xb4,
-    0xd4, 0x23, 0xae, 0x45, 0xed, 0x34, 0xad, 0x57, 0x54, 0x35, 0xa4, 0x93,
-    0xa6, 0xd5, 0xbf, 0x3f, 0x42, 0x58, 0xd3, 0x32, 0x70, 0x6c, 0x71, 0x19,
-    0xef, 0xde, 0xe0, 0x9f, 0x62, 0x36, 0x68, 0x5a, 0xdd, 0xf7, 0xd7, 0xf8,
-    0xe7, 0x69, 0xfa, 0xcf, 0x76, 0x07, 0xb7, 0x9c, 0xfc, 0xcc, 0x1c, 0x1d,
-    0x7c, 0xaf, 0x8d, 0xa4, 0xaf, 0x96, 0x88, 0x5e, 0x6e, 0x26, 0xfa, 0x6a,
-    0x89, 0xd2, 0xff, 0x6d, 0xa6, 0xcd, 0xed, 0x34, 0x2d, 0xd8, 0xac, 0x31,
-    0xe4, 0x67, 0xd2, 0x94, 0x7e, 0xaf, 0x5d, 0xd3, 0x9a, 0x3b, 0x7b, 0xc0,
-    0xb9, 0xa7, 0x88, 0x58, 0x9a, 0x57, 0x54, 0x9b, 0x9a, 0x71, 0x0e, 0xc0,
-    0x15, 0x81, 0xfa, 0x1c, 0x57, 0xb3, 0x22, 0x78, 0x26, 0x9d, 0x77, 0x45,
-    0xb4, 0x42, 0x51, 0x09, 0x1d, 0xba, 0x7a, 0x72, 0x44, 0xa5, 0xf0, 0x50,
-    0x95, 0x98, 0xd6, 0xbc, 0x0a, 0x37, 0xc7, 0x61, 0x59, 0xcc, 0xa3, 0x5e,
-    0xef, 0xbf, 0xe9, 0xce, 0x6e, 0x96, 0x46, 0x64, 0x31, 0x90, 0x34, 0x3c,
-    0x6b, 0x5b, 0xef, 0xe8, 0x22, 0x60, 0xde, 0x8d, 0xe6, 0x15, 0x01, 0xfe,
-    0x5e, 0x03, 0x3e, 0x33, 0x0a, 0xc4, 0x9d, 0x79, 0x68, 0x73, 0xc7, 0x50,
-    0xed, 0x61, 0x16, 0x8c, 0xc0, 0xa5, 0xe6, 0xbc, 0xa8, 0x9c, 0x40, 0x10,
-    0x49, 0x6e, 0xdf, 0x9e, 0x28, 0xfa, 0xc4, 0xc8, 0x8c, 0xe6, 0x7d, 0xaf,
-    0x5e, 0x91, 0x37, 0xb0, 0x4e, 0xd7, 0xab, 0xfa, 0x1b, 0x12, 0x66, 0xbb,
-    0x5c, 0x94, 0x1b, 0x5d, 0x5c, 0x36, 0xec, 0x4f, 0xe5, 0x69, 0x5f, 0x69,
-    0x78, 0x16, 0xf2, 0x98, 0xf2, 0xa0, 0x43, 0xdb, 0x8f, 0x6b, 0xe3, 0x78,
-    0xa3, 0x8b, 0xca, 0x3e, 0x5a, 0xff, 0x45, 0xa5, 0xbc, 0x7c, 0x35, 0x8b,
-    0x10, 0xaa, 0xb4, 0x8f, 0x17, 0x8a, 0x96, 0x95, 0xc7, 0xca, 0xbf, 0xf1,
-    0xd1, 0x70, 0x39, 0xa5, 0xfd, 0x36, 0x07, 0x57, 0xdb, 0xd8, 0x69, 0x0c,
-    0x26, 0x6e, 0x28, 0xef, 0xee, 0xb2, 0x4b, 0x6e, 0xdf, 0x7f, 0xe0, 0x55,
-    0x13, 0xd6, 0xf0, 0x87, 0x8d, 0xb6, 0x4c, 0xe5, 0xe5, 0xb7, 0x16, 0x78,
-    0x87, 0x1d, 0xa5, 0x31, 0x77, 0xcf, 0xe4, 0x85, 0x1e, 0x6d, 0xd6, 0xf0,
-    0x89, 0x44, 0xe7, 0x8c, 0xa8, 0x9e, 0x36, 0x14, 0x45, 0xaf, 0x92, 0xa0,
-    0x86, 0x4f, 0x06, 0x8a, 0x65, 0x44, 0x59, 0xbb, 0x78, 0x89, 0xaf, 0x8a,
-    0xa2, 0x3f, 0xae, 0x68, 0xb0, 0xfd, 0x30, 0x30, 0x35, 0xdc, 0xbf, 0x28,
-    0x5e, 0xa0, 0x24, 0xe6, 0x1f, 0x16, 0xc3, 0xca, 0x00, 0xf7, 0x09, 0x48,
-    0x0d, 0x6b, 0xa8, 0x47, 0xd7, 0x05, 0xb2, 0xab, 0x1b, 0xb6, 0x67, 0x82,
-    0xdc, 0x62, 0x45, 0xe1, 0x91, 0x1a, 0x3e, 0x91, 0xe8, 0xbd, 0x02, 0x28,
-    0x71, 0x48, 0x2f, 0x7b, 0x16, 0xd4, 0xb3, 0x3f, 0x35, 0x66, 0xad, 0xa1,
-    0x17, 0xac, 0x4e, 0x45, 0x00, 0x46, 0x17, 0x95, 0xb8, 0x5e, 0x68, 0x3c,
-    0x6b, 0x39, 0x07, 0x1f, 0x42, 0x79, 0x93, 0x44, 0xed, 0x37, 0x70, 0x6b,
-    0x58, 0x29, 0xfe, 0x1f, 0xab, 0x8c, 0x94, 0x1d, 0x35, 0x90, 0xb5, 0xea,
+    0xd7, 0x1d, 0xfe, 0x69, 0xa4, 0xe0, 0x0e, 0x33, 0x94, 0xb2, 0x87, 0x24,
+    0x94, 0x61, 0x97, 0xb5, 0x60, 0x0f, 0xca, 0xae, 0xe7, 0x3e, 0xc8, 0x5d,
+    0x4b, 0xae, 0xe9, 0x4b, 0x65, 0xa7, 0xa4, 0x52, 0x5b, 0x68, 0xbc, 0xf5,
+    0x41, 0x8a, 0x33, 0x62, 0x6f, 0x7b, 0xa8, 0xdd, 0xbe, 0xe4, 0xcf, 0x48,
+    0xd5, 0x30, 0x52, 0x47, 0x85, 0x0c, 0xab, 0xc3, 0x9d, 0x95, 0x12, 0x66,
+    0xb7, 0x60, 0xec, 0x3c, 0x24, 0xb2, 0x07, 0x66, 0x56, 0x86, 0x8b, 0x5c,
+    0x48, 0x66, 0x79, 0x78, 0xc8, 0x81, 0x14, 0xec, 0xe1, 0x0d, 0xb9, 0x98,
+    0xa2, 0x18, 0x63, 0x14, 0x23, 0x02, 0xdf, 0x1e, 0xae, 0xee, 0xd5, 0xfd,
+    0x73, 0xce, 0xbd, 0xe7, 0x5e, 0x29, 0xa9, 0xd3, 0xe8, 0xbc, 0x7c, 0x96,
+    0xef, 0x3d, 0xe7, 0xfc, 0xce, 0xd1, 0xef, 0x7c, 0xe7, 0x3b, 0xbf, 0x7b,
+    0xce, 0x15, 0x81, 0x88, 0x46, 0x89, 0xa8, 0x66, 0x08, 0x00, 0xeb, 0x00,
+    0x00, 0x64, 0xca, 0x88, 0x12, 0x50, 0xf3, 0x7a, 0xea, 0xf8, 0xd8, 0x62,
+    0xd5, 0x0e, 0x9a, 0xba, 0x93, 0x07, 0x00, 0x48, 0x23, 0x73, 0xa0, 0xf3,
+    0x00, 0x9d, 0x9b, 0xe4, 0xa2, 0x3c, 0x0e, 0x0c, 0xcc, 0xe6, 0x00, 0x00,
+    0xdf, 0x75, 0xc3, 0xeb, 0xf8, 0xe8, 0xa2, 0xa7, 0x8c, 0xb9, 0x4d, 0x85,
+    0x40, 0xfd, 0xf1, 0x14, 0x68, 0x1d, 0xa0, 0xf3, 0x93, 0xae, 0xd1, 0xbf,
+    0x09, 0x44, 0xae, 0xa1, 0xee, 0xc0, 0x75, 0x74, 0x8d, 0xee, 0x32, 0x00,
+    0x90, 0xaf, 0x38, 0x33, 0xaa, 0x5b, 0x94, 0xc7, 0x81, 0xfc, 0x76, 0xb1,
+    0x2e, 0x21, 0xea, 0x28, 0x84, 0x42, 0x37, 0xa2, 0xa4, 0x30, 0xa2, 0x17,
+    0x46, 0x75, 0x83, 0xb1, 0xf9, 0x5c, 0xdd, 0x71, 0xeb, 0xe8, 0x88, 0x8e,
+    0x37, 0xe4, 0x36, 0x8b, 0x90, 0x92, 0xb5, 0x65, 0x56, 0x3b, 0x94, 0x46,
+    0xe6, 0xea, 0x92, 0xa1, 0x8e, 0xb6, 0x68, 0x7b, 0x03, 0x36, 0x01, 0xff,
+    0xe6, 0x83, 0x67, 0x58, 0x33, 0xfa, 0xe3, 0xa9, 0xba, 0xe3, 0xd6, 0x91,
+    0x8b, 0xdc, 0x0b, 0xb9, 0xcd, 0x22, 0xfc, 0x71, 0x0f, 0x8c, 0x99, 0x48,
+    0x81, 0x92, 0x00, 0x8d, 0xcc, 0x81, 0x92, 0x40, 0xf0, 0xea, 0x22, 0x00,
+    0x60, 0x72, 0x45, 0x89, 0x32, 0x88, 0x96, 0xe3, 0xbf, 0x30, 0x59, 0xbd,
+    0xe3, 0x02, 0x18, 0x1e, 0x19, 0x45, 0xe4, 0x64, 0x1f, 0x22, 0xbd, 0x7d,
+    0x65, 0x8c, 0x20, 0x72, 0xb2, 0x0f, 0x43, 0xf1, 0x21, 0x00, 0x40, 0x3e,
+    0x9f, 0x7f, 0x74, 0x24, 0x09, 0x80, 0xd4, 0xb5, 0xda, 0x0e, 0xe8, 0xe2,
+    0x76, 0x11, 0x43, 0x71, 0x20, 0xd2, 0xdb, 0x87, 0xc0, 0x61, 0x19, 0x91,
+    0xde, 0x88, 0xf7, 0xf2, 0x1f, 0x80, 0x7d, 0x2c, 0xac, 0x0d, 0xc3, 0x5e,
+    0x50, 0x0c, 0xc5, 0x36, 0x6c, 0x53, 0x66, 0x15, 0x0f, 0x85, 0x71, 0x51,
+    0x04, 0xb0, 0x0a, 0xb4, 0xb4, 0x4b, 0x28, 0xb4, 0x17, 0xd1, 0xd2, 0x2e,
+    0x41, 0x6a, 0x0f, 0x70, 0x3f, 0x9f, 0x3a, 0x17, 0x7b, 0x24, 0x98, 0xfd,
+    0xd4, 0xb9, 0x98, 0x66, 0x7f, 0xcd, 0xec, 0x5d, 0x80, 0xa5, 0x3f, 0x06,
+    0xde, 0x1b, 0xf0, 0x34, 0x90, 0x1f, 0x88, 0x7d, 0x0c, 0xb4, 0x8e, 0xbc,
+    0x12, 0x5c, 0x33, 0xac, 0x48, 0x8a, 0xcc, 0x2c, 0x7a, 0xd2, 0xb8, 0x5e,
+    0x18, 0x37, 0x72, 0xb2, 0xcf, 0xf0, 0x45, 0x04, 0xbb, 0x43, 0x18, 0x1e,
+    0x19, 0x05, 0x00, 0x8c, 0x8d, 0x4f, 0x02, 0x71, 0x40, 0xee, 0x0e, 0x6a,
+    0xd7, 0xa5, 0xf6, 0x00, 0x16, 0xb3, 0x8b, 0x7b, 0x9f, 0x71, 0x55, 0xfb,
+    0x6b, 0xe5, 0x10, 0x30, 0x3a, 0xac, 0xd4, 0x1e, 0x40, 0xa4, 0xb7, 0xaf,
+    0x2a, 0xa6, 0xad, 0xa9, 0x7d, 0x1c, 0xb4, 0xfc, 0x43, 0x86, 0x4b, 0x0d,
+    0xea, 0xc0, 0xae, 0x00, 0x10, 0x98, 0xc8, 0x54, 0xa5, 0x71, 0xe5, 0x2b,
+    0x19, 0x71, 0x87, 0x82, 0x91, 0x61, 0xb1, 0xcc, 0xef, 0x40, 0xdc, 0x51,
+    0xec, 0x4b, 0xcd, 0xa4, 0x6c, 0xcb, 0x57, 0xef, 0xab, 0xd6, 0x41, 0xaa,
+    0xba, 0x6e, 0x67, 0x5f, 0xde, 0x83, 0x7d, 0x00, 0x02, 0x87, 0x65, 0xcb,
+    0x0c, 0x84, 0x82, 0x43, 0x7f, 0x3d, 0x04, 0xfb, 0x9c, 0xee, 0xf7, 0x8d,
+    0x12, 0x51, 0x94, 0x88, 0x92, 0x44, 0x14, 0x05, 0xe0, 0xfb, 0x60, 0x8a,
+    0x68, 0x5f, 0x98, 0xe8, 0xbe, 0x18, 0x46, 0xa4, 0x2c, 0x25, 0x5f, 0x6d,
+    0x23, 0x5e, 0x8a, 0xfe, 0x2d, 0x4b, 0x97, 0x97, 0xda, 0x84, 0xcb, 0xe3,
+    0xe1, 0xd8, 0x91, 0x0d, 0xea, 0x79, 0xfe, 0x90, 0x2f, 0xa9, 0xb7, 0x97,
+    0x81, 0xd9, 0xec, 0x22, 0x8e, 0x9f, 0xf8, 0x2d, 0xed, 0xd2, 0x2e, 0x35,
+    0x50, 0x03, 0x05, 0xe4, 0x0e, 0x4a, 0x0c, 0xc5, 0x1d, 0xf3, 0x19, 0x10,
+    0x40, 0xf8, 0x58, 0x0f, 0xad, 0x7d, 0xbd, 0xa6, 0x95, 0xa3, 0xc7, 0xa0,
+    0x1c, 0xa4, 0xfe, 0xde, 0x28, 0x35, 0x3f, 0xf7, 0x8c, 0xaf, 0xe3, 0xb0,
+    0x8c, 0xdd, 0x9d, 0x5d, 0x6a, 0x68, 0x6c, 0xa0, 0x85, 0x1b, 0x69, 0x4a,
+    0xfa, 0x7c, 0x3e, 0x7d, 0x79, 0xe9, 0xf9, 0x0c, 0x4e, 0x9f, 0x3d, 0x4d,
+    0x5b, 0x3b, 0x5b, 0x24, 0xb5, 0xb4, 0x50, 0xe7, 0x5f, 0x3f, 0xf7, 0xa9,
+    0x76, 0xb6, 0x7d, 0xd1, 0x46, 0x1d, 0xb7, 0x3a, 0x69, 0x77, 0x67, 0xd7,
+    0x50, 0xbe, 0xd4, 0xd2, 0x42, 0xd2, 0xcf, 0x25, 0x1a, 0x7c, 0x77, 0xd0,
+    0x58, 0x5e, 0x1c, 0x68, 0xfd, 0xa2, 0x8d, 0x1a, 0xa8, 0x81, 0x2e, 0x7e,
+    0x7c, 0x91, 0x3a, 0x5f, 0x7e, 0xd1, 0x97, 0x18, 0x19, 0x45, 0xf2, 0x2f,
+    0x49, 0x2d, 0xbf, 0xff, 0xc0, 0x7e, 0xda, 0xfa, 0xe6, 0x2e, 0xed, 0xd2,
+    0x2e, 0xad, 0xdc, 0xca, 0x5a, 0xec, 0x51, 0x51, 0xb5, 0x9b, 0xd5, 0x3e,
+    0x2d, 0x1f, 0x80, 0xce, 0x23, 0x5d, 0x5a, 0x79, 0xfa, 0xfb, 0x1a, 0x1a,
+    0x1b, 0x68, 0x41, 0x4e, 0xd3, 0x46, 0xef, 0x06, 0x1d, 0x3c, 0x54, 0xfe,
+    0x5e, 0x04, 0xec, 0x6b, 0x68, 0x6c, 0xd0, 0xda, 0xab, 0xaf, 0x27, 0xf1,
+    0x69, 0x92, 0x66, 0xae, 0xcf, 0xd0, 0xda, 0x37, 0x6b, 0x86, 0x7a, 0xfc,
+    0x07, 0xf6, 0x53, 0xfa, 0xf5, 0x69, 0xba, 0xf7, 0xe6, 0x3d, 0x7a, 0xf2,
+    0x47, 0x3f, 0xf4, 0x25, 0xc9, 0x34, 0xf2, 0xbc, 0x3c, 0xe1, 0xb2, 0x4b,
+    0x6e, 0x35, 0xac, 0xd3, 0x13, 0x34, 0xa1, 0x3d, 0x0c, 0xb0, 0x6a, 0xb4,
+    0x60, 0x77, 0x08, 0x28, 0x00, 0x99, 0xf9, 0x8c, 0xd0, 0x88, 0x57, 0xf3,
+    0x07, 0x0e, 0xcb, 0x4a, 0x43, 0xca, 0x4c, 0x3b, 0xf0, 0xde, 0x80, 0xc6,
+    0x48, 0x81, 0x57, 0x64, 0xa0, 0x08, 0xe0, 0x95, 0x4a, 0x7d, 0xc1, 0xee,
+    0xa0, 0xd5, 0xbe, 0xa3, 0xd6, 0xeb, 0x43, 0xf1, 0x61, 0xab, 0x7d, 0x0b,
+    0x40, 0xe4, 0x64, 0x9f, 0xa1, 0x3c, 0xb3, 0x36, 0x34, 0x30, 0x62, 0xa9,
+    0xfc, 0x7f, 0x86, 0x26, 0x55, 0x3f, 0x9f, 0x3a, 0x17, 0xe3, 0xf7, 0x17,
+    0xd8, 0x9a, 0x1f, 0xcb, 0x50, 0xda, 0xa5, 0xab, 0x2f, 0xd8, 0x1d, 0x02,
+    0x00, 0x45, 0x42, 0x95, 0xfb, 0x41, 0xbb, 0xff, 0x68, 0x95, 0xf6, 0x99,
+    0x18, 0x1f, 0x47, 0xa1, 0xfc, 0xbf, 0x00, 0x84, 0xde, 0x3e, 0x66, 0xec,
+    0xef, 0x32, 0xd3, 0x6b, 0x4c, 0x1b, 0xbd, 0xb6, 0x88, 0xcb, 0xff, 0xf6,
+    0xc0, 0x88, 0x3f, 0x4e, 0x13, 0x4e, 0x74, 0x32, 0x59, 0xb6, 0x9f, 0x88,
+    0x3e, 0x71, 0xc9, 0xdc, 0x76, 0x18, 0x3b, 0x1b, 0xa6, 0x83, 0x1c, 0xe6,
+    0x30, 0x33, 0x65, 0xeb, 0x0b, 0x6d, 0x16, 0x06, 0x31, 0x33, 0x45, 0x4b,
+    0x4b, 0x0b, 0x75, 0xfe, 0xb2, 0x93, 0x7a, 0x8e, 0x85, 0x8d, 0x8c, 0x04,
+    0x20, 0xbb, 0x94, 0xa5, 0xb6, 0xb6, 0x5f, 0x58, 0x18, 0xba, 0xb5, 0x5d,
+    0x82, 0x9e, 0x91, 0x12, 0x9f, 0x26, 0x49, 0xcf, 0x24, 0xd3, 0xd7, 0xa6,
+    0x2a, 0xcc, 0x63, 0xb2, 0x63, 0xe5, 0x56, 0x96, 0xa6, 0xaf, 0x4f, 0xd3,
+    0x99, 0x0f, 0xce, 0xd3, 0x2e, 0xed, 0x92, 0xbf, 0xd1, 0x4f, 0xfd, 0xbd,
+    0xfd, 0xd4, 0xd3, 0xf3, 0x86, 0xcf, 0xce, 0x7e, 0x95, 0x91, 0x12, 0xed,
+    0x01, 0xa8, 0xf5, 0x44, 0x7b, 0xa3, 0xd4, 0xff, 0x9b, 0xe3, 0xbe, 0x68,
+    0x6f, 0x1f, 0x96, 0x96, 0x96, 0x2c, 0x4c, 0x7d, 0xec, 0xcd, 0x63, 0xd4,
+    0xf5, 0x5a, 0xb7, 0x6f, 0x7c, 0x7c, 0x12, 0x3d, 0xff, 0x0a, 0x53, 0x74,
+    0x2b, 0x4a, 0xb4, 0xaf, 0x81, 0xda, 0x7e, 0xde, 0x46, 0xfd, 0x27, 0xa2,
+    0x1a, 0xc3, 0xe9, 0xeb, 0x09, 0x1d, 0x09, 0x51, 0xf3, 0x1f, 0xce, 0x38,
+    0xf7, 0x43, 0xad, 0xec, 0x3b, 0xd2, 0x45, 0xd1, 0x13, 0xfd, 0xa4, 0x5e,
+    0x0f, 0xca, 0x41, 0x6a, 0x19, 0x3a, 0x6f, 0xf8, 0x7e, 0x4f, 0x9f, 0x8b,
+    0x61, 0xe6, 0xfa, 0x0c, 0xed, 0xd2, 0x2e, 0x05, 0x5e, 0x08, 0x50, 0xc7,
+    0x9f, 0x3f, 0xf1, 0x29, 0x1a, 0xa2, 0x54, 0x5d, 0x3c, 0x56, 0xdd, 0x8b,
+    0x60, 0x49, 0x9b, 0xb5, 0x63, 0x5a, 0xd7, 0xd1, 0x04, 0x00, 0x43, 0xf1,
+    0x61, 0x60, 0x56, 0x2c, 0x8a, 0xa0, 0x31, 0x03, 0xa3, 0x3c, 0x95, 0x61,
+    0x82, 0xdd, 0x21, 0x43, 0x7e, 0x64, 0xa1, 0x31, 0x85, 0x85, 0x61, 0x48,
+    0x59, 0x4d, 0x5b, 0x18, 0xe9, 0x68, 0xc5, 0x9e, 0xb1, 0x89, 0x49, 0x3e,
+    0x13, 0xae, 0x56, 0x18, 0x4a, 0x5d, 0xcd, 0x33, 0xed, 0x5d, 0x30, 0x69,
+    0x78, 0x53, 0x3b, 0x58, 0xed, 0x55, 0xeb, 0x45, 0x16, 0xd6, 0xf6, 0xd8,
+    0xf4, 0xab, 0xda, 0xde, 0x60, 0x77, 0xd0, 0x50, 0x9e, 0xba, 0x88, 0x75,
+    0x6b, 0x1f, 0xee, 0x18, 0xeb, 0x0f, 0xbd, 0x7d, 0xcc, 0xc0, 0xe8, 0x98,
+    0x87, 0xe5, 0xfb, 0x03, 0x00, 0x85, 0x69, 0x3d, 0x68, 0x59, 0x3d, 0x06,
+    0xce, 0x86, 0x69, 0x81, 0xc9, 0xb5, 0x44, 0x17, 0xbf, 0x5a, 0xa3, 0xf7,
+    0x6e, 0x34, 0xd7, 0x84, 0x69, 0x15, 0x6d, 0xbb, 0x46, 0x3d, 0xcf, 0x3f,
+    0xe3, 0x4e, 0xa3, 0x12, 0xd1, 0x46, 0x3e, 0x8f, 0x83, 0x07, 0x0f, 0x52,
+    0xfa, 0xcb, 0x05, 0xea, 0xfc, 0xba, 0x83, 0xc2, 0x7f, 0xb7, 0x6a, 0x56,
+    0xbd, 0xc6, 0xea, 0x7f, 0x7f, 0x90, 0x96, 0x6e, 0x65, 0x69, 0x6b, 0x67,
+    0x8b, 0xcb, 0xd8, 0xea, 0xfd, 0x77, 0xe3, 0xc0, 0xe5, 0xb2, 0x96, 0x53,
+    0xb5, 0xed, 0xda, 0xd7, 0x6b, 0xd4, 0x73, 0x22, 0xaa, 0xe5, 0x8f, 0x9d,
+    0x3d, 0x45, 0x5d, 0xaf, 0x75, 0xfb, 0xcc, 0x4c, 0xcd, 0xd3, 0x9c, 0xe9,
+    0xf9, 0x0c, 0x06, 0xdf, 0x1d, 0xd4, 0x18, 0x39, 0xfa, 0x8f, 0x1b, 0x1c,
+    0x26, 0x8b, 0x60, 0x69, 0xe9, 0xb6, 0x66, 0x57, 0xff, 0x3f, 0xbf, 0xb2,
+    0x30, 0xd5, 0xc6, 0x37, 0x1b, 0x44, 0xf7, 0x89, 0x68, 0x1f, 0x51, 0x43,
+    0xe3, 0x93, 0x94, 0xf8, 0xe8, 0x22, 0x93, 0x69, 0x2d, 0xf6, 0xb8, 0xec,
+    0x07, 0xd7, 0xf6, 0x09, 0xcc, 0x88, 0x7a, 0xf4, 0x37, 0xfa, 0x69, 0xee,
+    0xda, 0xb4, 0xe2, 0xf1, 0xd2, 0x48, 0xf5, 0x8c, 0x68, 0x97, 0x86, 0x16,
+    0x6a, 0xc7, 0xb8, 0x05, 0x1b, 0x46, 0x74, 0x8b, 0xa9, 0x99, 0x94, 0x81,
+    0x31, 0x46, 0x47, 0x46, 0xa1, 0x67, 0x38, 0x4d, 0xd3, 0x96, 0x57, 0xb3,
+    0x63, 0x13, 0x93, 0x4c, 0x86, 0x41, 0x1e, 0x5c, 0x06, 0xd7, 0x34, 0x61,
+    0xb9, 0x5e, 0x56, 0x7e, 0x27, 0xcd, 0xa9, 0xe6, 0x17, 0xd1, 0x8c, 0x6e,
+    0xda, 0xbf, 0x98, 0x5d, 0x64, 0xb6, 0xc7, 0xcc, 0x90, 0xaa, 0xa6, 0xd5,
+    0xf7, 0x03, 0x8b, 0xa1, 0xdd, 0xda, 0x67, 0xae, 0x5f, 0x34, 0x5e, 0xfe,
+    0x83, 0x8d, 0xed, 0x22, 0x96, 0xbe, 0x25, 0xa2, 0xcf, 0xa6, 0x88, 0x28,
+    0xec, 0x19, 0xa7, 0x6e, 0x6f, 0x70, 0xb8, 0x96, 0x68, 0x30, 0x40, 0x34,
+    0xb9, 0xb3, 0xa1, 0x30, 0x66, 0x95, 0xf5, 0x3c, 0xf5, 0xc7, 0x29, 0x8a,
+    0x02, 0x70, 0xd2, 0xb4, 0xd9, 0xec, 0x22, 0x9c, 0xee, 0xeb, 0x7a, 0xb5,
+    0x8b, 0x5e, 0xa4, 0x17, 0xb5, 0x91, 0x7c, 0x77, 0x27, 0x4a, 0xad, 0x6f,
+    0x19, 0x19, 0x33, 0xe9, 0xf3, 0xf9, 0xe8, 0x90, 0xcf, 0x97, 0xf4, 0xf9,
+    0x7c, 0x3d, 0x6f, 0xbd, 0xe1, 0x0b, 0x1f, 0x78, 0x43, 0xbb, 0xbf, 0x4d,
+    0x6a, 0xa3, 0x24, 0x11, 0xd1, 0x21, 0x9f, 0x2f, 0x78, 0x24, 0x48, 0x0d,
+    0xd4, 0x60, 0x28, 0x4f, 0xfd, 0x3c, 0xfd, 0xfa, 0x94, 0x56, 0xef, 0xa0,
+    0x34, 0xa8, 0x5d, 0xff, 0xfc, 0x8b, 0xab, 0xdc, 0x99, 0x21, 0x7c, 0xac,
+    0xa7, 0x92, 0xff, 0x05, 0x25, 0xbf, 0xbe, 0xfc, 0xc4, 0x67, 0x49, 0x65,
+    0x2d, 0xf2, 0x59, 0xbf, 0xa1, 0x3e, 0x37, 0x33, 0x50, 0x9b, 0xd4, 0x66,
+    0xb0, 0x57, 0x6d, 0x4f, 0x14, 0x40, 0xeb, 0xef, 0x95, 0x7e, 0xe8, 0x6a,
+    0xec, 0xa2, 0xe9, 0xeb, 0x53, 0xc6, 0x7e, 0x78, 0x33, 0x6c, 0x68, 0x1f,
+    0x49, 0xe4, 0xc9, 0x3e, 0x73, 0xfd, 0x1f, 0x9e, 0x3d, 0xcd, 0x9d, 0x79,
+    0x36, 0xf2, 0x79, 0xa8, 0x9f, 0x09, 0xa8, 0x01, 0x03, 0x26, 0xe6, 0x6c,
+    0x99, 0x56, 0x4b, 0xe5, 0x98, 0x6e, 0xb5, 0xf5, 0x8d, 0x2d, 0xdb, 0x68,
+    0x2f, 0x58, 0xe3, 0xb4, 0x63, 0x13, 0xe5, 0x99, 0xa0, 0xa8, 0x40, 0x66,
+    0x3e, 0x63, 0x60, 0x54, 0x55, 0x73, 0x62, 0xde, 0x46, 0xe3, 0xc1, 0xb8,
+    0x6a, 0x66, 0x5d, 0x67, 0x69, 0x66, 0x2d, 0xca, 0x60, 0x63, 0x9f, 0x21,
+    0xfe, 0x09, 0xc6, 0xaa, 0x39, 0x5f, 0x61, 0x32, 0x47, 0xcd, 0x68, 0xc3,
+    0x50, 0x2c, 0x8d, 0xca, 0x6a, 0x8f, 0x7e, 0x06, 0x0a, 0xbc, 0x22, 0x1b,
+    0x19, 0xd8, 0x64, 0x9f, 0x6b, 0x4d, 0x6b, 0xb6, 0xa3, 0x50, 0xb9, 0xae,
+    0xce, 0x6c, 0x9a, 0x7d, 0x45, 0x00, 0xa5, 0xca, 0x9a, 0x41, 0x8b, 0x1e,
+    0x44, 0xbc, 0x46, 0x0d, 0x54, 0xf4, 0x4f, 0x13, 0xfa, 0xba, 0xb8, 0x2c,
+    0xcb, 0x4b, 0xbe, 0x4f, 0xd3, 0x44, 0xdf, 0x76, 0x7a, 0xaa, 0x77, 0xe0,
+    0x6c, 0x98, 0x5a, 0x38, 0x23, 0xf2, 0xde, 0x76, 0x11, 0xc7, 0xfb, 0x8f,
+    0xd3, 0xd2, 0xed, 0xdb, 0xc2, 0x5a, 0x49, 0x6a, 0x69, 0xa1, 0x0f, 0xcf,
+    0x7c, 0x48, 0xcd, 0xcf, 0x36, 0x93, 0x39, 0x3e, 0xeb, 0x3f, 0xb0, 0x9f,
+    0x76, 0x77, 0xee, 0x31, 0x35, 0x9d, 0x45, 0x03, 0x9e, 0x03, 0x5a, 0xaf,
+    0x1b, 0x35, 0x9a, 0xaa, 0xed, 0xcc, 0x33, 0x01, 0x2f, 0xfe, 0xa9, 0xc7,
+    0xe6, 0x03, 0xcd, 0x34, 0xfc, 0xf1, 0x45, 0x6a, 0x7e, 0x4e, 0xd1, 0xf0,
+    0xc9, 0xc3, 0x32, 0x54, 0x3b, 0x58, 0x9a, 0xb1, 0xf9, 0x40, 0x33, 0x85,
+    0x52, 0x57, 0x9d, 0xa3, 0x2b, 0xc4, 0xd6, 0x94, 0x7a, 0x4d, 0xdf, 0x21,
+    0x1b, 0xe3, 0xc7, 0x22, 0xfd, 0x70, 0xb5, 0x3b, 0x04, 0x35, 0xce, 0xca,
+    0xb2, 0x4f, 0xd5, 0xe6, 0x66, 0x3b, 0xf4, 0x6b, 0x02, 0x5e, 0x7f, 0x34,
+    0x3f, 0xdb, 0x4c, 0x53, 0x9f, 0x8f, 0x2b, 0x8c, 0x5f, 0x0d, 0xf3, 0x85,
+    0xca, 0x9b, 0x61, 0xbc, 0xa6, 0x53, 0xe9, 0x9c, 0xc7, 0x27, 0x64, 0x36,
+    0x4c, 0xab, 0x63, 0x84, 0xa1, 0xf8, 0x10, 0x78, 0x71, 0x42, 0xcc, 0x82,
+    0xad, 0xa1, 0x50, 0x66, 0x66, 0x35, 0x6e, 0xba, 0xa0, 0x30, 0x2c, 0x50,
+    0x5e, 0xd5, 0x96, 0xa0, 0x68, 0x5f, 0x95, 0xb9, 0xf5, 0xcc, 0x55, 0xde,
+    0xf3, 0xa0, 0xe6, 0x1b, 0x8a, 0x0f, 0xd9, 0xda, 0x99, 0x9a, 0x49, 0x19,
+    0xee, 0xaf, 0xe4, 0x1b, 0xb6, 0xda, 0xa5, 0xde, 0xaf, 0xb3, 0x47, 0xb5,
+    0x57, 0xcd, 0x97, 0x99, 0x77, 0xf1, 0xe4, 0x50, 0xd7, 0x5e, 0xb5, 0x3d,
+    0xcc, 0xff, 0xeb, 0xec, 0x52, 0xfb, 0x0b, 0x59, 0x18, 0xfa, 0x41, 0xd4,
+    0x3e, 0xdb, 0x27, 0x8f, 0x8c, 0xfa, 0x22, 0x27, 0xfb, 0x80, 0x55, 0x28,
+    0x51, 0x04, 0xdd, 0xfd, 0xe4, 0x69, 0xdf, 0xeb, 0xa5, 0xca, 0xae, 0xad,
+    0x6a, 0x53, 0x66, 0xb5, 0x00, 0x4a, 0xb8, 0xab, 0xdf, 0x1f, 0xdf, 0xfb,
+    0x9b, 0x5b, 0xea, 0xf8, 0xe0, 0x90, 0x3c, 0x45, 0x09, 0x04, 0xf6, 0x1b,
+    0xb8, 0x4a, 0xdb, 0x65, 0xd2, 0x72, 0x63, 0x87, 0x4d, 0xc3, 0xd4, 0x93,
+    0x16, 0x03, 0xb3, 0x80, 0x8c, 0xca, 0x61, 0xca, 0xfa, 0xa9, 0xe0, 0xef,
+    0x07, 0x8a, 0x33, 0xed, 0x05, 0xb1, 0xdd, 0x5c, 0xd5, 0x26, 0x51, 0x7b,
+    0xec, 0x1a, 0xd6, 0xc4, 0x61, 0x6e, 0x29, 0x59, 0x3d, 0x43, 0x17, 0xcb,
+    0x03, 0x22, 0xb3, 0x5e, 0x00, 0xc0, 0x29, 0x4f, 0x77, 0x3d, 0xb3, 0x5e,
+    0xa8, 0xe9, 0x40, 0x29, 0x72, 0x06, 0x9e, 0x5a, 0x5f, 0x6c, 0x3e, 0x87,
+    0x18, 0xca, 0xa7, 0xa4, 0x6b, 0x50, 0xdf, 0xf0, 0xcd, 0x55, 0x44, 0x50,
+    0xde, 0xb4, 0x04, 0x20, 0xb7, 0x69, 0x6c, 0x4f, 0xea, 0x4e, 0x1e, 0xf2,
+    0xb8, 0x72, 0x5d, 0xc1, 0x39, 0xc4, 0xe0, 0xfd, 0xcc, 0x5f, 0x6e, 0xb3,
+    0x80, 0x18, 0x8c, 0xe5, 0x85, 0x4c, 0xe5, 0x89, 0x31, 0x6d, 0xe2, 0xa1,
+    0xf8, 0xab, 0x96, 0xaa, 0x65, 0x5a, 0xaf, 0xf9, 0x44, 0xb0, 0x50, 0xb2,
+    0xce, 0x3c, 0x66, 0x87, 0xe5, 0xcd, 0x50, 0x55, 0x39, 0x10, 0x2a, 0x7b,
+    0x43, 0xa4, 0x11, 0x18, 0xb5, 0xf4, 0x36, 0x98, 0xed, 0xcd, 0xac, 0xa3,
+    0xaa, 0xf6, 0x0e, 0xdf, 0xb4, 0x96, 0xeb, 0xdf, 0x14, 0x6b, 0x2f, 0xad,
+    0x97, 0x67, 0x38, 0x17, 0xed, 0x0b, 0xd9, 0xec, 0x06, 0xd4, 0xf7, 0x9f,
+    0x33, 0xd3, 0x3e, 0x24, 0x86, 0x35, 0xa7, 0x6a, 0x98, 0xd6, 0x6b, 0x3e,
+    0xa1, 0xa9, 0xc9, 0x54, 0x9e, 0xf9, 0x30, 0x66, 0x68, 0x22, 0xc3, 0xb5,
+    0x5b, 0x1e, 0x07, 0x78, 0x4c, 0x29, 0xc2, 0x78, 0xdc, 0x76, 0x70, 0xfa,
+    0x2b, 0x86, 0xea, 0xda, 0x1b, 0xe3, 0x94, 0xab, 0x77, 0xa0, 0x62, 0x09,
+    0x90, 0xc7, 0xf9, 0xfd, 0x2d, 0x74, 0xe6, 0x0f, 0x40, 0xd3, 0xa5, 0x14,
+    0xb7, 0xdf, 0xcc, 0xf9, 0x1d, 0x99, 0xf6, 0x41, 0xa4, 0xdc, 0xa6, 0xa2,
+    0x61, 0x53, 0x2b, 0x0e, 0x8e, 0xbb, 0x07, 0x99, 0xd6, 0x89, 0x41, 0x9d,
+    0xf6, 0x23, 0x4b, 0xa5, 0xf2, 0x5e, 0x0d, 0xb7, 0xf5, 0x83, 0xdf, 0x8e,
+    0xcc, 0x3a, 0x9b, 0x69, 0x63, 0xf3, 0x1e, 0xea, 0xd1, 0x61, 0x6c, 0xde,
+    0x05, 0x83, 0x83, 0xbf, 0x4b, 0xd0, 0x76, 0xcf, 0x88, 0x4d, 0xbe, 0xa6,
+    0x04, 0x3b, 0x1f, 0xd9, 0x79, 0x78, 0xa0, 0xf6, 0xfe, 0x5a, 0x71, 0x48,
+    0xdd, 0x99, 0xb2, 0x21, 0x00, 0x05, 0xc6, 0xe2, 0x2e, 0x04, 0xb6, 0x5d,
+    0x4e, 0xda, 0xf4, 0xbb, 0x64, 0x5a, 0x91, 0xf7, 0x42, 0xf8, 0xe3, 0xee,
+    0xb5, 0x6e, 0x6c, 0x3e, 0xe7, 0x9a, 0x69, 0xb9, 0x8e, 0xe2, 0x66, 0xa0,
+    0xb8, 0x29, 0x17, 0xf6, 0x6f, 0x1a, 0x6a, 0x4a, 0x54, 0x34, 0xf7, 0xc0,
+    0x6c, 0x0e, 0xbc, 0xb5, 0x07, 0x9d, 0xb7, 0x7f, 0x13, 0x11, 0x5f, 0x93,
+    0x6c, 0x82, 0x1b, 0x25, 0x08, 0x5d, 0x05, 0xa8, 0xa4, 0x48, 0x07, 0x5a,
+    0x07, 0xe8, 0x8a, 0x07, 0xa7, 0xdd, 0x66, 0xd4, 0x5b, 0x16, 0xfb, 0x5a,
+    0xda, 0x06, 0xa8, 0x60, 0xbd, 0x2f, 0x34, 0x81, 0x3d, 0xcb, 0xb4, 0xdc,
+    0xfe, 0x74, 0xfb, 0x64, 0x8f, 0xe5, 0x40, 0x9c, 0x76, 0x80, 0xcb, 0xb4,
+    0xd5, 0xbd, 0x47, 0x22, 0x36, 0xcf, 0x8e, 0xa3, 0xc3, 0x41, 0x2b, 0xf3,
+    0x18, 0x5a, 0x04, 0xfd, 0x9b, 0xce, 0xe5, 0x5b, 0x46, 0xb0, 0x8a, 0x41,
+    0xd3, 0x83, 0x83, 0x81, 0x74, 0x0e, 0x74, 0x89, 0x3f, 0xf2, 0x5c, 0x3b,
+    0x2d, 0x6f, 0x44, 0x9a, 0x34, 0x74, 0xe8, 0xaa, 0xf5, 0x6c, 0x99, 0xc5,
+    0x51, 0xcc, 0x8e, 0xf5, 0x9d, 0x32, 0x2d, 0x5f, 0xd3, 0xb2, 0x30, 0x72,
+    0x4d, 0xec, 0x6c, 0x9a, 0x17, 0xa6, 0x7d, 0x18, 0x9a, 0x96, 0x87, 0x99,
+    0xf5, 0x82, 0xeb, 0xb3, 0x86, 0x52, 0x52, 0x4c, 0xf3, 0xdb, 0xae, 0x76,
+    0x35, 0x07, 0x4b, 0xcc, 0xd9, 0x8e, 0x10, 0x27, 0x6d, 0xca, 0x74, 0xda,
+    0x12, 0xbf, 0x3c, 0x4b, 0xfd, 0x2e, 0x57, 0xc5, 0x7b, 0x49, 0xd3, 0x4a,
+    0x25, 0x20, 0xa5, 0x3f, 0x63, 0x06, 0xc5, 0xd1, 0xf5, 0xfb, 0x97, 0x43,
+    0x13, 0x02, 0x27, 0x2a, 0xc0, 0x6f, 0xc7, 0x9e, 0xd0, 0xb4, 0x0c, 0x74,
+    0x73, 0xaa, 0xbb, 0x69, 0x1b, 0xc2, 0x71, 0x74, 0x2e, 0x33, 0x55, 0x1c,
+    0x96, 0xaf, 0x79, 0x1f, 0x08, 0xd3, 0x9a, 0x34, 0xb5, 0xf9, 0x3e, 0xff,
+    0x05, 0x67, 0xc7, 0xdb, 0x4b, 0x9a, 0x96, 0xc7, 0x1c, 0xc5, 0x92, 0x51,
+    0xb3, 0x3b, 0xad, 0xb2, 0x07, 0x66, 0x1f, 0x01, 0x4d, 0x2b, 0x98, 0x9f,
+    0x85, 0x4d, 0x97, 0xc4, 0x37, 0xf8, 0x13, 0x88, 0x28, 0x34, 0x61, 0x1d,
+    0x51, 0x00, 0x40, 0x22, 0x67, 0xc6, 0x3c, 0x3e, 0x1d, 0x73, 0x62, 0x5a,
+    0x91, 0x78, 0xdd, 0x5e, 0x64, 0x5a, 0xa0, 0x72, 0x5d, 0xe8, 0x14, 0x31,
+    0xac, 0xe5, 0x61, 0x5b, 0xe7, 0xe8, 0x00, 0x58, 0xf1, 0x52, 0x03, 0xa3,
+    0xed, 0x31, 0x4d, 0xab, 0xda, 0xed, 0xf6, 0xcc, 0xa1, 0xe8, 0x2b, 0xb1,
+    0xaa, 0x3f, 0xb9, 0xf0, 0xf4, 0x02, 0xe1, 0x9d, 0x0e, 0x72, 0x9b, 0xbc,
+    0xee, 0xf2, 0xca, 0xfc, 0xfa, 0x2e, 0x75, 0xfc, 0xe4, 0x29, 0xdb, 0x93,
+    0x0b, 0xc7, 0xcf, 0x03, 0xbc, 0xfc, 0xf9, 0xdf, 0xdd, 0xa3, 0x83, 0xe5,
+    0x53, 0x9d, 0x6e, 0x4e, 0x3e, 0xa8, 0xe8, 0x3b, 0x37, 0x09, 0x7d, 0x79,
+    0xb1, 0x97, 0x56, 0xe8, 0xf4, 0xcb, 0x3f, 0xd3, 0xca, 0xeb, 0xbc, 0x92,
+    0xc1, 0x8d, 0xff, 0x75, 0x10, 0xdd, 0x9f, 0x22, 0xf9, 0xa7, 0x61, 0xea,
+    0xe9, 0x11, 0x3b, 0xd3, 0xb6, 0xff, 0xa3, 0x29, 0xda, 0xba, 0x2f, 0xde,
+    0x0f, 0xa3, 0xa7, 0x8c, 0x27, 0x0c, 0x58, 0xdf, 0x9f, 0xf0, 0x99, 0x3a,
+    0x0e, 0xde, 0x06, 0x10, 0x67, 0x94, 0x8b, 0xb3, 0x61, 0xee, 0xbe, 0xd7,
+    0x7b, 0x25, 0xe0, 0xc9, 0x27, 0x88, 0xbc, 0xfa, 0x93, 0x7f, 0xdf, 0x14,
+    0xdd, 0x7d, 0x9f, 0x5f, 0xbe, 0xe1, 0x34, 0x6e, 0x13, 0x6b, 0x35, 0x2f,
+    0xc8, 0x7c, 0x0f, 0x8b, 0x69, 0x85, 0x76, 0x77, 0x11, 0xd9, 0x33, 0xad,
+    0xc0, 0x48, 0xae, 0x95, 0xa6, 0x15, 0xb5, 0xd7, 0x0b, 0x33, 0xe9, 0xf3,
+    0xe7, 0x38, 0x67, 0xf1, 0x5c, 0xd5, 0xcf, 0xc0, 0xa6, 0x04, 0xdb, 0x1e,
+    0xae, 0x86, 0x5d, 0x07, 0xec, 0xfc, 0x48, 0x1a, 0x51, 0xbe, 0xfb, 0xd8,
+    0xbc, 0x12, 0xce, 0xe2, 0x95, 0xcf, 0x9c, 0x71, 0xf4, 0xdf, 0xaf, 0xfa,
+    0xc7, 0xd8, 0x72, 0x5e, 0x48, 0x7b, 0x38, 0x45, 0x19, 0x84, 0x9d, 0xd6,
+    0x65, 0x3d, 0x6e, 0xb4, 0x94, 0x53, 0x39, 0x11, 0x38, 0xec, 0x1d, 0xb0,
+    0x1b, 0x10, 0x2e, 0x34, 0xad, 0x3c, 0xee, 0xfe, 0x05, 0x1a, 0x22, 0x6f,
+    0x54, 0x67, 0x69, 0x73, 0x5e, 0xbc, 0xdd, 0xab, 0x44, 0x88, 0x5c, 0x63,
+    0xbf, 0x11, 0x88, 0x19, 0xed, 0x80, 0x12, 0x57, 0xb5, 0x8b, 0x0a, 0xf0,
+    0xe2, 0xd2, 0xc3, 0x37, 0x57, 0xb9, 0x51, 0x06, 0x7f, 0x1c, 0x18, 0xbe,
+    0xb9, 0x6a, 0xc9, 0x47, 0xc6, 0x0e, 0xf7, 0xf0, 0x26, 0x98, 0x92, 0x07,
+    0x8f, 0xf5, 0xf0, 0x3e, 0x04, 0xd9, 0x85, 0x83, 0x79, 0x99, 0x31, 0xec,
+    0x46, 0x7c, 0x4a, 0x77, 0xb2, 0xa0, 0xe6, 0x9a, 0x96, 0xe9, 0x30, 0xce,
+    0xfd, 0xe3, 0x86, 0xa9, 0x65, 0x35, 0x8e, 0xee, 0xb0, 0x3a, 0x57, 0x77,
+    0xc7, 0xf1, 0x18, 0x90, 0xa9, 0x39, 0x6d, 0xee, 0x17, 0x9d, 0xd9, 0xb0,
+    0x0d, 0x48, 0x36, 0x33, 0xaf, 0x6a, 0xbf, 0x51, 0xd3, 0x92, 0xf7, 0x37,
+    0xcc, 0xa8, 0x1a, 0xc7, 0x4d, 0x72, 0xfb, 0x3e, 0x04, 0x7f, 0x63, 0x98,
+    0x56, 0x7a, 0xc5, 0xb5, 0xa8, 0x9d, 0xa6, 0xf5, 0x8a, 0xaa, 0x86, 0x74,
+    0xd2, 0xb4, 0xfa, 0xf7, 0x47, 0x08, 0x6b, 0x5a, 0x06, 0x8e, 0x2f, 0xaf,
+    0xe2, 0x57, 0xd7, 0xf9, 0xa7, 0x98, 0x0d, 0x9a, 0x56, 0xf7, 0xfd, 0x35,
+    0xff, 0x69, 0x9a, 0xfe, 0xb3, 0xd3, 0xc5, 0xcd, 0x27, 0x3f, 0xbd, 0x40,
+    0xfb, 0xdf, 0xe9, 0x20, 0xe9, 0xcb, 0x15, 0xa2, 0x97, 0x5a, 0x89, 0xbe,
+    0x5c, 0xa1, 0xf4, 0x7f, 0x5b, 0x69, 0x6b, 0x27, 0x4d, 0x4b, 0x36, 0x6b,
+    0x0c, 0xf9, 0xe9, 0x34, 0xa5, 0xdf, 0xe9, 0xd4, 0xb4, 0xe6, 0xbd, 0x12,
+    0x70, 0xe6, 0x09, 0x22, 0x96, 0xe6, 0x15, 0xd5, 0xa6, 0x66, 0x5c, 0x00,
+    0x70, 0x59, 0xa0, 0x3c, 0xc7, 0xd5, 0xac, 0x08, 0x9e, 0x4a, 0xe7, 0x5c,
+    0x11, 0xad, 0x50, 0x54, 0x42, 0x87, 0xae, 0x9e, 0x1c, 0x51, 0x39, 0x3c,
+    0x54, 0x23, 0xa6, 0x35, 0xaf, 0xc2, 0xcd, 0x71, 0x58, 0x3b, 0xa6, 0x1d,
+    0x98, 0x75, 0x67, 0x37, 0x4b, 0x23, 0xb2, 0x18, 0x48, 0x1a, 0x99, 0xb3,
+    0x2d, 0x77, 0x6c, 0x19, 0x30, 0xef, 0x46, 0xab, 0x66, 0xa6, 0xe1, 0xed,
+    0x35, 0xe0, 0x33, 0xa3, 0x40, 0xdc, 0x99, 0x87, 0x36, 0x33, 0x86, 0x6a,
+    0x0f, 0x33, 0x63, 0x04, 0x2e, 0x35, 0xe7, 0x05, 0xe5, 0x04, 0x82, 0x48,
+    0x72, 0xfb, 0xf6, 0x44, 0xd1, 0x27, 0x46, 0x66, 0x34, 0xef, 0x7b, 0xf5,
+    0x8a, 0xbc, 0x8e, 0x75, 0xba, 0x5e, 0xd3, 0xdf, 0x90, 0x30, 0xdb, 0xe5,
+    0x22, 0xdf, 0xd8, 0xf2, 0xaa, 0x61, 0x7f, 0x2a, 0x4f, 0xfb, 0x4a, 0x23,
+    0x73, 0x90, 0xc7, 0x95, 0x07, 0x1d, 0xda, 0x7e, 0x5c, 0x1b, 0xc7, 0x1b,
+    0x5b, 0x56, 0xf6, 0xd1, 0xfa, 0x2f, 0x28, 0xf9, 0xe5, 0x2b, 0x19, 0x84,
+    0x50, 0xa3, 0x7d, 0xbc, 0x50, 0xb4, 0xac, 0x3c, 0x5e, 0xf9, 0x8d, 0x8f,
+    0xa6, 0x4b, 0x29, 0xed, 0xb7, 0x39, 0xb8, 0xda, 0xc6, 0x4e, 0x63, 0x30,
+    0x71, 0x5b, 0x79, 0x77, 0x97, 0x5d, 0x72, 0xfb, 0xfe, 0x03, 0xaf, 0x9a,
+    0xb0, 0x8e, 0xdf, 0x6f, 0xb4, 0x65, 0x2a, 0x2f, 0xbf, 0xb5, 0xc0, 0x3b,
+    0xec, 0x28, 0x8d, 0xbb, 0x7b, 0x26, 0x2f, 0xf4, 0x68, 0xb3, 0x8e, 0x8f,
+    0x25, 0x3a, 0xdf, 0x88, 0xda, 0x69, 0x43, 0x51, 0xf4, 0x2a, 0x09, 0xea,
+    0xf8, 0x78, 0xa0, 0xd8, 0x8d, 0xa8, 0x68, 0x17, 0x2f, 0xf1, 0x55, 0x51,
+    0xf4, 0xc7, 0x15, 0x0d, 0xb6, 0x17, 0x3a, 0xa6, 0x8e, 0x7b, 0x17, 0xc5,
+    0x33, 0x94, 0xc5, 0xfc, 0x83, 0x62, 0x58, 0x19, 0xe0, 0x3e, 0x01, 0xa9,
+    0x63, 0x1d, 0xf5, 0xe8, 0x3a, 0x43, 0x66, 0xbd, 0x60, 0x7b, 0x26, 0xc8,
+    0x2d, 0x56, 0x15, 0x1e, 0xa9, 0xe3, 0x63, 0x89, 0xde, 0x0b, 0x80, 0x12,
+    0x87, 0xf4, 0xb2, 0x67, 0x41, 0x3d, 0xfb, 0x53, 0x67, 0xd6, 0x3a, 0x7a,
+    0xc1, 0xda, 0x14, 0x04, 0x60, 0x6c, 0x59, 0x89, 0xeb, 0x85, 0x26, 0x32,
+    0x96, 0x73, 0xf0, 0x21, 0x54, 0x36, 0x49, 0xd4, 0x7f, 0x03, 0xb7, 0x8e,
+    0xd5, 0xe2, 0xff, 0x01, 0xa9, 0xe3, 0x9f, 0x66, 0x9e, 0xee, 0x93, 0xe0,
     0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
 };
 
@@ -831,18 +831,23 @@ void ConfigurationPanel::languageChange()
     codec1->clear();
     codec1->insertItem( tr( "G711u" ) );
     codec1->insertItem( tr( "G711a" ) );
+    codec1->insertItem( tr( "GSM" ) );
     codec2->clear();
     codec2->insertItem( tr( "G711a" ) );
     codec2->insertItem( tr( "G711u" ) );
+    codec2->insertItem( tr( "GSM" ) );
     codec3->clear();
     codec3->insertItem( tr( "G711u" ) );
     codec3->insertItem( tr( "G711a" ) );
+    codec3->insertItem( tr( "GSM" ) );
     codec4->clear();
     codec4->insertItem( tr( "G711u" ) );
     codec4->insertItem( tr( "G711a" ) );
+    codec4->insertItem( tr( "GSM" ) );
     codec5->clear();
     codec5->insertItem( tr( "G711u" ) );
     codec5->insertItem( tr( "G711a" ) );
+    codec5->insertItem( tr( "GSM" ) );
     textLabel1_4->setText( tr( "1" ) );
     textLabel1_4_2->setText( tr( "2" ) );
     textLabel1_4_3->setText( tr( "3" ) );
diff --git a/src/configurationpanelui.h b/src/configurationpanelui.h
index 4dbbb4b3dc..8f8193a222 100644
--- a/src/configurationpanelui.h
+++ b/src/configurationpanelui.h
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form interface generated from reading ui file 'configurationpanel.ui'
 **
-** Created: Mon Feb 7 11:33:42 2005
+** Created: Thu Feb 10 12:16:26 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/manager.cpp b/src/manager.cpp
index ee41e5d2f7..aca5bcc20b 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -65,8 +65,8 @@ Manager::Manager (QString *Dc = NULL) {
 					Qt::WStyle_NoBorder,this);
 
 	sip = new SIP(this);
-	audioRTP = new AudioRtp(this->sip, this);
 	tone = new ToneGenerator(this);
+	audioRTP = new AudioRtp(this);
 	
 	sip_init();
 	
@@ -74,9 +74,9 @@ Manager::Manager (QString *Dc = NULL) {
 
 	// Init variables
 	b_ringing = false;
-	mute = false;
 	b_ringtone = false;
 	b_congestion = false;
+	mute = false;
 
 	if (DirectCall) { 
 		qWarning ("Direct call.....");
@@ -200,7 +200,9 @@ Manager::ring (bool var) {
 		this->b_ringing = var;
 	}
 	tonezone = ringing();
-	tone->playRing ((gui()->getRingFile()).ascii());
+
+	if (sip->getNumberPendingCalls() == 1) 
+		tone->playRing ((gui()->getRingFile()).ascii());
 }
 
 // When IP-phone user makes call
@@ -222,6 +224,16 @@ Manager::congestion (bool var) {
 	tone->toneHandle(ZT_TONE_CONGESTION);
 }
 
+void
+Manager::notificationIncomingCall (void) {
+	short *buffer = new short[SAMPLING_RATE];
+	
+	tone->generateSin(440, 0, AMPLITUDE, SAMPLING_RATE, buffer);
+		
+	audiodriver->audio_buf.resize(SAMPLING_RATE);
+	audiodriver->audio_buf.setData(buffer, getSpkrVolume());
+	delete[] buffer;
+}
 #if 0
 bool
 Manager::getCallInProgress (void) {
diff --git a/src/manager.h b/src/manager.h
index 4297653f71..50d3b6595b 100644
--- a/src/manager.h
+++ b/src/manager.h
@@ -91,6 +91,7 @@ public:
 	void	ringTone				(bool);
 	void	startDialTone			(void);
 	void	congestion				(bool); 
+	void	notificationIncomingCall(void);
 	void	errorDisplay			(char*);
 	void	nameDisplay				(char*);
 	void	spkrSoundVolume			(int);
diff --git a/src/phonebookui.cpp b/src/phonebookui.cpp
index 7a9cfb624d..1827c9b47e 100644
--- a/src/phonebookui.cpp
+++ b/src/phonebookui.cpp
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form implementation generated from reading ui file 'phonebook.ui'
 **
-** Created: Mon Feb 7 11:33:42 2005
+** Created: Thu Feb 10 12:16:24 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/phonebookui.h b/src/phonebookui.h
index 3b364498b8..497f1b8d41 100644
--- a/src/phonebookui.h
+++ b/src/phonebookui.h
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form interface generated from reading ui file 'phonebook.ui'
 **
-** Created: Mon Feb 7 11:33:42 2005
+** Created: Thu Feb 10 12:16:24 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/sip.cpp b/src/sip.cpp
index 7c32f3bba8..f889e0894b 100644
--- a/src/sip.cpp
+++ b/src/sip.cpp
@@ -214,7 +214,7 @@ SIP::getNumberPendingCalls(void) {
   
   	for (k = 0; k < NUMBER_OF_LINES; k++) {
 		assert (k < NUMBER_OF_LINES);
-	    if (call[k]->state != NOT_USED) {
+	    if (call[k] != NULL) {
 	  		pos++;
 		}
     }
@@ -361,6 +361,7 @@ SIP::setRegister (void) {
 	
 	eXosip_lock();
 	if (setAuthentication() == -1) {
+		eXosip_unlock();
 		return -1;
 	}
 	
@@ -837,10 +838,11 @@ SIP::getEvent (void) {
 			break;
 
 		case EXOSIP_CALL_REQUESTFAILURE:
+#if 0
 			qDebug("REQUESTFAILURE<- (%i %i) [%i %s] %s", event->cid, 
 				event->did, event->status_code, event->reason_phrase,
 				event->remote_uri);
-				
+#endif
 				theline = findLineNumber(event);
 				assert (theline >= 0);
 				assert (theline < NUMBER_OF_LINES);
@@ -850,10 +852,10 @@ SIP::getEvent (void) {
 			// Handle 4XX errors
 			switch (event->status_code) {
 				case AUTH_REQUIRED:
-					eXosip_lock();
 					if (setAuthentication() == -1) {
 						break;
 					}
+					eXosip_lock();
 					eXosip_retry_call (event->cid);
 					eXosip_unlock();
 					break;
@@ -963,9 +965,11 @@ SIP::getEvent (void) {
 			break;
 
 		case EXOSIP_REGISTRATION_FAILURE:
+#if 0
 			qDebug("REGISTRATION_FAILURE <- (%i) [%i %s] %s for REGISTER %s", 
 				event->rid, event->status_code, event->reason_phrase, 
 				event->remote_uri, event->req_uri);
+#endif
 			if (countReg <= 3) { 
 				setRegister();
 				countReg++;
diff --git a/src/tonegenerator.cpp b/src/tonegenerator.cpp
index 47f1db70e7..7940d6989e 100644
--- a/src/tonegenerator.cpp
+++ b/src/tonegenerator.cpp
@@ -36,10 +36,9 @@ using namespace std;
 ///////////////////////////////////////////////////////////////////////////////
 // ToneThread implementation
 ///////////////////////////////////////////////////////////////////////////////
-ToneThread::ToneThread (Manager *mngr, short *buf, int total) {
+ToneThread::ToneThread (Manager *mngr, short *buf) {
 	this->mngr = mngr;
 	this->buffer = buf;
-	this->totalbytes = total;
 }
 
 ToneThread::~ToneThread (void) {
@@ -49,9 +48,9 @@ ToneThread::~ToneThread (void) {
 void
 ToneThread::run (void) {
 	while (mngr->tonezone) {
-		mngr->audiodriver->audio_buf.setData (buffer, mngr->getSpkrVolume());	
+		mngr->audiodriver->audio_buf.setData(buffer, mngr->getSpkrVolume());
 		mngr->audiodriver->writeBuffer();
-	}
+	} 
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -158,8 +157,8 @@ ToneGenerator::buildTone (int idCountry, int idTones, int samplingRate,
 							int amplitude, short* temp) {
 	QString s;
 	int count = 0;
-	int	oct = 0,
-		oct_temp = 0,
+	int	byte = 0,
+		byte_temp = 0,
 		nbcomma;
 	short *buffer = new short[1024*1024];
 
@@ -175,20 +174,22 @@ ToneGenerator::buildTone (int idCountry, int idTones, int samplingRate,
 		
 		// If there is time or if it's unlimited
 		if (time) {
-			oct = (samplingRate*2*time)/1000;
+			byte = (samplingRate*2*time)/1000;
 		} else {
-			oct = samplingRate;
+			byte = samplingRate;
 		}
 		
 		// To concatenate the different buffers for each section.
-		for (int j = oct_temp * i; j < oct + (oct_temp * i); j++) {
+		for (int j = byte_temp * i; j < byte + (byte_temp * i); j++) {
 			temp[j] = buffer[count++];
 		}		
-		oct_temp = oct;
+		byte_temp = byte;
 		count = 0;
 	}
 	// Total number in final buffer
-	totalbytes = oct + (oct_temp * (nbcomma+1));
+	totalbytes = byte + (byte_temp * (nbcomma+1));
+	
+	delete[] buffer;
 }
 
 /**
@@ -234,7 +235,7 @@ ToneGenerator::toneHandle (int idr) {
 
 		// New thread for the tone
 		if (tonethread == NULL) {
-			tonethread = new ToneThread (manager, buf, totalbytes);
+			tonethread = new ToneThread (manager, buf);
 			manager->audiodriver->audio_buf.resize(totalbytes);	
 			tonethread->start();
 		}
@@ -283,9 +284,10 @@ ToneGenerator::playRing (const char *fileName) {
 				dst,
 				(unsigned char *)src,
 				length);
+	
 	// Start tone thread
 	if (tonethread == NULL) {
-		tonethread = new ToneThread (manager, dst, expandedsize);
+		tonethread = new ToneThread (manager, dst);
 		manager->audiodriver->audio_buf.resize(expandedsize);
 		tonethread->start();
 	}
@@ -301,3 +303,4 @@ ToneGenerator::playRing (const char *fileName) {
 	return 1;
 }
 
+
diff --git a/src/tonegenerator.h b/src/tonegenerator.h
index 256049f457..693afaf5c2 100644
--- a/src/tonegenerator.h
+++ b/src/tonegenerator.h
@@ -47,14 +47,13 @@ using namespace ost;
 ///////////////////////////////////////////////////////////////////////////////
 class ToneThread : public Thread {
 public:
-	ToneThread (Manager *, short *, int);
+	ToneThread (Manager *, short *);
 	~ToneThread (void);
 
 	virtual void run ();
 private:
-	Manager *mngr;
-	short	*buffer;
-	int		 totalbytes;
+	Manager*	mngr;
+	short*		buffer;
 };
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -85,9 +84,9 @@ public:
 private:
 	void		 initTone (void);
 	
-	Manager 	*manager;
-	ToneThread	*tonethread;
-
+	Manager*	manager;
+	ToneThread*	tonethread;
+	
 };
 
 #endif // __TONE_GENRATOR_H__
diff --git a/src/url_inputui.cpp b/src/url_inputui.cpp
index e992ba1816..5dd00baa5d 100644
--- a/src/url_inputui.cpp
+++ b/src/url_inputui.cpp
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form implementation generated from reading ui file 'url_input.ui'
 **
-** Created: Mon Feb 7 11:33:42 2005
+** Created: Thu Feb 10 12:16:26 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
diff --git a/src/url_inputui.h b/src/url_inputui.h
index 54dd2ea82b..1fc6372dba 100644
--- a/src/url_inputui.h
+++ b/src/url_inputui.h
@@ -1,7 +1,7 @@
 /****************************************************************************
 ** Form interface generated from reading ui file 'url_input.ui'
 **
-** Created: Mon Feb 7 11:33:42 2005
+** Created: Thu Feb 10 12:16:26 2005
 **      by: The User Interface Compiler ($Id$)
 **
 ** WARNING! All changes made in this file will be lost!
-- 
GitLab