Description: Include auto-generated files.
 Include the files generated by running "debian/rules new-upstream".
 .
 This avoids a few build-dependencies and makes the build process slightly
 faster.
--- a/Makefile
+++ b/Makefile
@@ -54,9 +54,9 @@
 DESTDIR = /usr/local/
 BINDIR = bin
 # The man pages go into $(DESTDIR)$(MANDIR)
-MANDIR = man/man1
-# and the appropriate suffix is 1
-MANSUFFIX = 1
+MANDIR = man/man6
+# and the appropriate suffix is 6
+MANSUFFIX = 6
 
 ### End of local configuration.
 
@@ -155,7 +155,7 @@
 # Not Windows. If gtk+ is properly installed, this is all that's needed.
 ifdef Gtk
 EXTRA_INCLUDES=`pkg-config --cflags gtk+-$(Gtk)`
-GUILIBS=`pkg-config --libs gtk+-$(Gtk)`
+GUILIBS=-lgtk-x11-2.0 -lgdk-x11-2.0 -lgobject-2.0 -lglib-2.0 -lm
 else
 EXTRA_INCLUDES=`gtk-config --cflags`
 GUILIBS=`gtk-config --libs`
@@ -502,1419 +502,14 @@
  protocol.h cmsg_union.h pmsg_union.h protocol-enums.h game-enums.h \
  sysdep.h game-enums.c
 sysdep.o: sysdep.c sysdep.h
-gui.o: gui.c gui.h /usr/include/gtk-2.0/gtk/gtk.h \
- /usr/include/gtk-2.0/gdk/gdk.h \
- /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h \
- /usr/include/glib-2.0/gio/gio.h /usr/include/glib-2.0/gio/giotypes.h \
- /usr/include/glib-2.0/gio/gioenums.h /usr/include/glib-2.0/glib-object.h \
- /usr/include/glib-2.0/gobject/gbinding.h /usr/include/glib-2.0/glib.h \
- /usr/include/glib-2.0/glib/galloca.h /usr/include/glib-2.0/glib/gtypes.h \
- /usr/lib/glib-2.0/include/glibconfig.h \
- /usr/include/glib-2.0/glib/gmacros.h /usr/include/glib-2.0/glib/garray.h \
- /usr/include/glib-2.0/glib/gasyncqueue.h \
- /usr/include/glib-2.0/glib/gthread.h /usr/include/glib-2.0/glib/gerror.h \
- /usr/include/glib-2.0/glib/gquark.h /usr/include/glib-2.0/glib/gutils.h \
- /usr/include/glib-2.0/glib/gatomic.h \
- /usr/include/glib-2.0/glib/gbacktrace.h \
- /usr/include/glib-2.0/glib/gbase64.h \
- /usr/include/glib-2.0/glib/gbitlock.h \
- /usr/include/glib-2.0/glib/gbookmarkfile.h \
- /usr/include/glib-2.0/glib/gcache.h /usr/include/glib-2.0/glib/glist.h \
- /usr/include/glib-2.0/glib/gmem.h /usr/include/glib-2.0/glib/gslice.h \
- /usr/include/glib-2.0/glib/gchecksum.h \
- /usr/include/glib-2.0/glib/gcompletion.h \
- /usr/include/glib-2.0/glib/gconvert.h \
- /usr/include/glib-2.0/glib/gdataset.h /usr/include/glib-2.0/glib/gdate.h \
- /usr/include/glib-2.0/glib/gdatetime.h \
- /usr/include/glib-2.0/glib/gtimezone.h /usr/include/glib-2.0/glib/gdir.h \
- /usr/include/glib-2.0/glib/gfileutils.h \
- /usr/include/glib-2.0/glib/ghash.h /usr/include/glib-2.0/glib/ghook.h \
- /usr/include/glib-2.0/glib/ghostutils.h \
- /usr/include/glib-2.0/glib/giochannel.h \
- /usr/include/glib-2.0/glib/gmain.h /usr/include/glib-2.0/glib/gpoll.h \
- /usr/include/glib-2.0/glib/gslist.h /usr/include/glib-2.0/glib/gstring.h \
- /usr/include/glib-2.0/glib/gunicode.h \
- /usr/include/glib-2.0/glib/gkeyfile.h \
- /usr/include/glib-2.0/glib/gmappedfile.h \
- /usr/include/glib-2.0/glib/gmarkup.h \
- /usr/include/glib-2.0/glib/gmessages.h \
- /usr/include/glib-2.0/glib/gnode.h /usr/include/glib-2.0/glib/goption.h \
- /usr/include/glib-2.0/glib/gpattern.h \
- /usr/include/glib-2.0/glib/gprimes.h /usr/include/glib-2.0/glib/gqsort.h \
- /usr/include/glib-2.0/glib/gqueue.h /usr/include/glib-2.0/glib/grand.h \
- /usr/include/glib-2.0/glib/grel.h /usr/include/glib-2.0/glib/gregex.h \
- /usr/include/glib-2.0/glib/gscanner.h \
- /usr/include/glib-2.0/glib/gsequence.h \
- /usr/include/glib-2.0/glib/gshell.h /usr/include/glib-2.0/glib/gspawn.h \
- /usr/include/glib-2.0/glib/gstrfuncs.h \
- /usr/include/glib-2.0/glib/gtestutils.h \
- /usr/include/glib-2.0/glib/gthreadpool.h \
- /usr/include/glib-2.0/glib/gtimer.h /usr/include/glib-2.0/glib/gtree.h \
- /usr/include/glib-2.0/glib/gurifuncs.h \
- /usr/include/glib-2.0/glib/gvarianttype.h \
- /usr/include/glib-2.0/glib/gvariant.h \
- /usr/include/glib-2.0/gobject/gobject.h \
- /usr/include/glib-2.0/gobject/gtype.h \
- /usr/include/glib-2.0/gobject/gvalue.h \
- /usr/include/glib-2.0/gobject/gparam.h \
- /usr/include/glib-2.0/gobject/gclosure.h \
- /usr/include/glib-2.0/gobject/gsignal.h \
- /usr/include/glib-2.0/gobject/gmarshal.h \
- /usr/include/glib-2.0/gobject/gboxed.h \
- /usr/include/glib-2.0/gobject/genums.h \
- /usr/include/glib-2.0/gobject/gparamspecs.h \
- /usr/include/glib-2.0/gobject/gsourceclosure.h \
- /usr/include/glib-2.0/gobject/gtypemodule.h \
- /usr/include/glib-2.0/gobject/gtypeplugin.h \
- /usr/include/glib-2.0/gobject/gvaluearray.h \
- /usr/include/glib-2.0/gobject/gvaluetypes.h \
- /usr/include/glib-2.0/gio/gappinfo.h /usr/include/glib-2.0/gio/gaction.h \
- /usr/include/glib-2.0/gio/gsimpleaction.h \
- /usr/include/glib-2.0/gio/gactiongroup.h \
- /usr/include/glib-2.0/gio/gsimpleactiongroup.h \
- /usr/include/glib-2.0/gio/gactiongroup.h \
- /usr/include/glib-2.0/gio/gapplication.h \
- /usr/include/glib-2.0/gio/gapplicationcommandline.h \
- /usr/include/glib-2.0/gio/gasyncinitable.h \
- /usr/include/glib-2.0/gio/ginitable.h \
- /usr/include/glib-2.0/gio/gasyncresult.h \
- /usr/include/glib-2.0/gio/gbufferedinputstream.h \
- /usr/include/glib-2.0/gio/gfilterinputstream.h \
- /usr/include/glib-2.0/gio/ginputstream.h \
- /usr/include/glib-2.0/gio/gbufferedoutputstream.h \
- /usr/include/glib-2.0/gio/gfilteroutputstream.h \
- /usr/include/glib-2.0/gio/goutputstream.h \
- /usr/include/glib-2.0/gio/gcancellable.h \
- /usr/include/glib-2.0/gio/gcharsetconverter.h \
- /usr/include/glib-2.0/gio/gconverter.h \
- /usr/include/glib-2.0/gio/gcontenttype.h \
- /usr/include/glib-2.0/gio/gconverterinputstream.h \
- /usr/include/glib-2.0/gio/gconverteroutputstream.h \
- /usr/include/glib-2.0/gio/gcredentials.h \
- /usr/include/glib-2.0/gio/gdatainputstream.h \
- /usr/include/glib-2.0/gio/gdataoutputstream.h \
- /usr/include/glib-2.0/gio/gdbusaddress.h \
- /usr/include/glib-2.0/gio/gdbusauthobserver.h \
- /usr/include/glib-2.0/gio/gdbusconnection.h \
- /usr/include/glib-2.0/gio/gdbuserror.h \
- /usr/include/glib-2.0/gio/gdbusintrospection.h \
- /usr/include/glib-2.0/gio/gdbusmessage.h \
- /usr/include/glib-2.0/gio/gdbusmethodinvocation.h \
- /usr/include/glib-2.0/gio/gdbusnameowning.h \
- /usr/include/glib-2.0/gio/gdbusnamewatching.h \
- /usr/include/glib-2.0/gio/gdbusproxy.h \
- /usr/include/glib-2.0/gio/gdbusserver.h \
- /usr/include/glib-2.0/gio/gdbusutils.h \
- /usr/include/glib-2.0/gio/gdrive.h \
- /usr/include/glib-2.0/gio/gemblemedicon.h \
- /usr/include/glib-2.0/gio/gicon.h /usr/include/glib-2.0/gio/gemblem.h \
- /usr/include/glib-2.0/gio/gfileattribute.h \
- /usr/include/glib-2.0/gio/gfileenumerator.h \
- /usr/include/glib-2.0/gio/gfile.h /usr/include/glib-2.0/gio/gfileicon.h \
- /usr/include/glib-2.0/gio/gfileinfo.h \
- /usr/include/glib-2.0/gio/gfileinputstream.h \
- /usr/include/glib-2.0/gio/gfileiostream.h \
- /usr/include/glib-2.0/gio/giostream.h \
- /usr/include/glib-2.0/gio/gioerror.h \
- /usr/include/glib-2.0/gio/gfilemonitor.h \
- /usr/include/glib-2.0/gio/gfilenamecompleter.h \
- /usr/include/glib-2.0/gio/gfileoutputstream.h \
- /usr/include/glib-2.0/gio/ginetaddress.h \
- /usr/include/glib-2.0/gio/ginetsocketaddress.h \
- /usr/include/glib-2.0/gio/gsocketaddress.h \
- /usr/include/glib-2.0/gio/gioenumtypes.h \
- /usr/include/glib-2.0/gio/giomodule.h /usr/include/glib-2.0/gmodule.h \
- /usr/include/glib-2.0/gio/gioscheduler.h \
- /usr/include/glib-2.0/gio/gloadableicon.h \
- /usr/include/glib-2.0/gio/gmemoryinputstream.h \
- /usr/include/glib-2.0/gio/gmemoryoutputstream.h \
- /usr/include/glib-2.0/gio/gmount.h \
- /usr/include/glib-2.0/gio/gmountoperation.h \
- /usr/include/glib-2.0/gio/gnativevolumemonitor.h \
- /usr/include/glib-2.0/gio/gvolumemonitor.h \
- /usr/include/glib-2.0/gio/gnetworkaddress.h \
- /usr/include/glib-2.0/gio/gnetworkservice.h \
- /usr/include/glib-2.0/gio/gpermission.h \
- /usr/include/glib-2.0/gio/gpollableinputstream.h \
- /usr/include/glib-2.0/gio/gpollableoutputstream.h \
- /usr/include/glib-2.0/gio/gproxy.h \
- /usr/include/glib-2.0/gio/gproxyaddress.h \
- /usr/include/glib-2.0/gio/gproxyaddressenumerator.h \
- /usr/include/glib-2.0/gio/gsocketaddressenumerator.h \
- /usr/include/glib-2.0/gio/gproxyresolver.h \
- /usr/include/glib-2.0/gio/gresolver.h \
- /usr/include/glib-2.0/gio/gseekable.h \
- /usr/include/glib-2.0/gio/gsettings.h \
- /usr/include/glib-2.0/gio/gsimpleasyncresult.h \
- /usr/include/glib-2.0/gio/gsimplepermission.h \
- /usr/include/glib-2.0/gio/gsocketclient.h \
- /usr/include/glib-2.0/gio/gsocketconnectable.h \
- /usr/include/glib-2.0/gio/gsocketconnection.h \
- /usr/include/glib-2.0/gio/gsocket.h \
- /usr/include/glib-2.0/gio/gsocketcontrolmessage.h \
- /usr/include/glib-2.0/gio/gsocketlistener.h \
- /usr/include/glib-2.0/gio/gsocketservice.h \
- /usr/include/glib-2.0/gio/gsrvtarget.h \
- /usr/include/glib-2.0/gio/gtcpconnection.h \
- /usr/include/glib-2.0/gio/gtcpwrapperconnection.h \
- /usr/include/glib-2.0/gio/gthemedicon.h \
- /usr/include/glib-2.0/gio/gthreadedsocketservice.h \
- /usr/include/glib-2.0/gio/gtlsbackend.h \
- /usr/include/glib-2.0/gio/gtlscertificate.h \
- /usr/include/glib-2.0/gio/gtlsclientconnection.h \
- /usr/include/glib-2.0/gio/gtlsconnection.h \
- /usr/include/glib-2.0/gio/gtlsserverconnection.h \
- /usr/include/glib-2.0/gio/gvfs.h /usr/include/glib-2.0/gio/gvolume.h \
- /usr/include/glib-2.0/gio/gzlibcompressor.h \
- /usr/include/glib-2.0/gio/gzlibdecompressor.h \
- /usr/include/gtk-2.0/gdk/gdkscreen.h /usr/include/cairo/cairo.h \
- /usr/include/cairo/cairo-version.h /usr/include/cairo/cairo-features.h \
- /usr/include/cairo/cairo-deprecated.h \
- /usr/include/gtk-2.0/gdk/gdktypes.h /usr/include/pango-1.0/pango/pango.h \
- /usr/include/pango-1.0/pango/pango-attributes.h \
- /usr/include/pango-1.0/pango/pango-font.h \
- /usr/include/pango-1.0/pango/pango-coverage.h \
- /usr/include/pango-1.0/pango/pango-types.h \
- /usr/include/pango-1.0/pango/pango-gravity.h \
- /usr/include/pango-1.0/pango/pango-matrix.h \
- /usr/include/pango-1.0/pango/pango-script.h \
- /usr/include/pango-1.0/pango/pango-language.h \
- /usr/include/pango-1.0/pango/pango-bidi-type.h \
- /usr/include/pango-1.0/pango/pango-break.h \
- /usr/include/pango-1.0/pango/pango-item.h \
- /usr/include/pango-1.0/pango/pango-context.h \
- /usr/include/pango-1.0/pango/pango-fontmap.h \
- /usr/include/pango-1.0/pango/pango-fontset.h \
- /usr/include/pango-1.0/pango/pango-engine.h \
- /usr/include/pango-1.0/pango/pango-glyph.h \
- /usr/include/pango-1.0/pango/pango-enum-types.h \
- /usr/include/pango-1.0/pango/pango-features.h \
- /usr/include/pango-1.0/pango/pango-glyph-item.h \
- /usr/include/pango-1.0/pango/pango-layout.h \
- /usr/include/pango-1.0/pango/pango-tabs.h \
- /usr/include/pango-1.0/pango/pango-renderer.h \
- /usr/include/pango-1.0/pango/pango-utils.h \
- /usr/lib/gtk-2.0/include/gdkconfig.h \
- /usr/include/gtk-2.0/gdk/gdkdisplay.h \
- /usr/include/gtk-2.0/gdk/gdkevents.h /usr/include/gtk-2.0/gdk/gdkcolor.h \
- /usr/include/gtk-2.0/gdk/gdkdnd.h /usr/include/gtk-2.0/gdk/gdkinput.h \
- /usr/include/gtk-2.0/gdk/gdkcairo.h /usr/include/gtk-2.0/gdk/gdkpixbuf.h \
- /usr/include/gtk-2.0/gdk/gdkrgb.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-features.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-core.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-transform.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-animation.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-simple-anim.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-io.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-loader.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-enum-types.h \
- /usr/include/pango-1.0/pango/pangocairo.h \
- /usr/include/gtk-2.0/gdk/gdkcursor.h \
- /usr/include/gtk-2.0/gdk/gdkdisplaymanager.h \
- /usr/include/gtk-2.0/gdk/gdkdrawable.h /usr/include/gtk-2.0/gdk/gdkgc.h \
- /usr/include/gtk-2.0/gdk/gdkenumtypes.h \
- /usr/include/gtk-2.0/gdk/gdkfont.h /usr/include/gtk-2.0/gdk/gdkimage.h \
- /usr/include/gtk-2.0/gdk/gdkkeys.h /usr/include/gtk-2.0/gdk/gdkpango.h \
- /usr/include/gtk-2.0/gdk/gdkpixmap.h \
- /usr/include/gtk-2.0/gdk/gdkproperty.h \
- /usr/include/gtk-2.0/gdk/gdkregion.h \
- /usr/include/gtk-2.0/gdk/gdkselection.h \
- /usr/include/gtk-2.0/gdk/gdkspawn.h \
- /usr/include/gtk-2.0/gdk/gdktestutils.h \
- /usr/include/gtk-2.0/gdk/gdkwindow.h \
- /usr/include/gtk-2.0/gdk/gdkvisual.h \
- /usr/include/gtk-2.0/gtk/gtkaboutdialog.h \
- /usr/include/gtk-2.0/gtk/gtkdialog.h \
- /usr/include/gtk-2.0/gtk/gtkwindow.h \
- /usr/include/gtk-2.0/gtk/gtkaccelgroup.h \
- /usr/include/gtk-2.0/gtk/gtkenums.h /usr/include/gtk-2.0/gtk/gtkbin.h \
- /usr/include/gtk-2.0/gtk/gtkcontainer.h \
- /usr/include/gtk-2.0/gtk/gtkwidget.h \
- /usr/include/gtk-2.0/gtk/gtkobject.h \
- /usr/include/gtk-2.0/gtk/gtktypeutils.h \
- /usr/include/gtk-2.0/gtk/gtktypebuiltins.h \
- /usr/include/gtk-2.0/gtk/gtkdebug.h \
- /usr/include/gtk-2.0/gtk/gtkadjustment.h \
- /usr/include/gtk-2.0/gtk/gtkstyle.h \
- /usr/include/gtk-2.0/gtk/gtksettings.h /usr/include/gtk-2.0/gtk/gtkrc.h \
- /usr/include/atk-1.0/atk/atk.h /usr/include/atk-1.0/atk/atkobject.h \
- /usr/include/atk-1.0/atk/atkstate.h \
- /usr/include/atk-1.0/atk/atkrelationtype.h \
- /usr/include/atk-1.0/atk/atkaction.h \
- /usr/include/atk-1.0/atk/atkcomponent.h \
- /usr/include/atk-1.0/atk/atkutil.h \
- /usr/include/atk-1.0/atk/atkdocument.h \
- /usr/include/atk-1.0/atk/atkeditabletext.h \
- /usr/include/atk-1.0/atk/atktext.h \
- /usr/include/atk-1.0/atk/atkgobjectaccessible.h \
- /usr/include/atk-1.0/atk/atkhyperlink.h \
- /usr/include/atk-1.0/atk/atkhyperlinkimpl.h \
- /usr/include/atk-1.0/atk/atkhypertext.h \
- /usr/include/atk-1.0/atk/atkimage.h \
- /usr/include/atk-1.0/atk/atknoopobject.h \
- /usr/include/atk-1.0/atk/atknoopobjectfactory.h \
- /usr/include/atk-1.0/atk/atkobjectfactory.h \
- /usr/include/atk-1.0/atk/atkplug.h \
- /usr/include/atk-1.0/atk/atkregistry.h \
- /usr/include/atk-1.0/atk/atkobjectfactory.h \
- /usr/include/atk-1.0/atk/atkrelation.h \
- /usr/include/atk-1.0/atk/atkrelationset.h \
- /usr/include/atk-1.0/atk/atkselection.h \
- /usr/include/atk-1.0/atk/atksocket.h \
- /usr/include/atk-1.0/atk/atkstateset.h \
- /usr/include/atk-1.0/atk/atkstreamablecontent.h \
- /usr/include/atk-1.0/atk/atktable.h /usr/include/atk-1.0/atk/atkmisc.h \
- /usr/include/atk-1.0/atk/atkvalue.h \
- /usr/include/gtk-2.0/gtk/gtkaccellabel.h \
- /usr/include/gtk-2.0/gtk/gtklabel.h /usr/include/gtk-2.0/gtk/gtkmisc.h \
- /usr/include/gtk-2.0/gtk/gtkmenu.h \
- /usr/include/gtk-2.0/gtk/gtkmenushell.h \
- /usr/include/gtk-2.0/gtk/gtkaccelmap.h \
- /usr/include/gtk-2.0/gtk/gtkaccessible.h \
- /usr/include/gtk-2.0/gtk/gtkaction.h \
- /usr/include/gtk-2.0/gtk/gtkactiongroup.h \
- /usr/include/gtk-2.0/gtk/gtkactivatable.h \
- /usr/include/gtk-2.0/gtk/gtkalignment.h \
- /usr/include/gtk-2.0/gtk/gtkarrow.h \
- /usr/include/gtk-2.0/gtk/gtkaspectframe.h \
- /usr/include/gtk-2.0/gtk/gtkframe.h \
- /usr/include/gtk-2.0/gtk/gtkassistant.h \
- /usr/include/gtk-2.0/gtk/gtkbbox.h /usr/include/gtk-2.0/gtk/gtkbox.h \
- /usr/include/gtk-2.0/gtk/gtkbindings.h \
- /usr/include/gtk-2.0/gtk/gtkbuildable.h \
- /usr/include/gtk-2.0/gtk/gtkbuilder.h \
- /usr/include/gtk-2.0/gtk/gtkbutton.h /usr/include/gtk-2.0/gtk/gtkimage.h \
- /usr/include/gtk-2.0/gtk/gtkcalendar.h \
- /usr/include/gtk-2.0/gtk/gtksignal.h \
- /usr/include/gtk-2.0/gtk/gtkmarshal.h \
- /usr/include/gtk-2.0/gtk/gtkcelleditable.h \
- /usr/include/gtk-2.0/gtk/gtkcelllayout.h \
- /usr/include/gtk-2.0/gtk/gtkcellrenderer.h \
- /usr/include/gtk-2.0/gtk/gtktreeviewcolumn.h \
- /usr/include/gtk-2.0/gtk/gtktreemodel.h \
- /usr/include/gtk-2.0/gtk/gtktreesortable.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendereraccel.h \
- /usr/include/gtk-2.0/gtk/gtkcellrenderertext.h \
- /usr/include/gtk-2.0/gtk/gtkcellrenderercombo.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendererpixbuf.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendererprogress.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendererspin.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendererspinner.h \
- /usr/include/gtk-2.0/gtk/gtkcellrenderertoggle.h \
- /usr/include/gtk-2.0/gtk/gtkcellview.h \
- /usr/include/gtk-2.0/gtk/gtkcheckbutton.h \
- /usr/include/gtk-2.0/gtk/gtktogglebutton.h \
- /usr/include/gtk-2.0/gtk/gtkcheckmenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkmenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkitem.h \
- /usr/include/gtk-2.0/gtk/gtkclipboard.h \
- /usr/include/gtk-2.0/gtk/gtkselection.h \
- /usr/include/gtk-2.0/gtk/gtktextiter.h \
- /usr/include/gtk-2.0/gtk/gtktexttag.h \
- /usr/include/gtk-2.0/gtk/gtktextchild.h \
- /usr/include/gtk-2.0/gtk/gtkcolorbutton.h \
- /usr/include/gtk-2.0/gtk/gtkcolorsel.h \
- /usr/include/gtk-2.0/gtk/gtkvbox.h \
- /usr/include/gtk-2.0/gtk/gtkcolorseldialog.h \
- /usr/include/gtk-2.0/gtk/gtkcombobox.h \
- /usr/include/gtk-2.0/gtk/gtktreeview.h /usr/include/gtk-2.0/gtk/gtkdnd.h \
- /usr/include/gtk-2.0/gtk/gtkentry.h \
- /usr/include/gtk-2.0/gtk/gtkeditable.h \
- /usr/include/gtk-2.0/gtk/gtkimcontext.h \
- /usr/include/gtk-2.0/gtk/gtkentrybuffer.h \
- /usr/include/gtk-2.0/gtk/gtkentrycompletion.h \
- /usr/include/gtk-2.0/gtk/gtkliststore.h \
- /usr/include/gtk-2.0/gtk/gtktreemodelfilter.h \
- /usr/include/gtk-2.0/gtk/gtkcomboboxentry.h \
- /usr/include/gtk-2.0/gtk/gtkdrawingarea.h \
- /usr/include/gtk-2.0/gtk/gtkeventbox.h \
- /usr/include/gtk-2.0/gtk/gtkexpander.h \
- /usr/include/gtk-2.0/gtk/gtkfixed.h \
- /usr/include/gtk-2.0/gtk/gtkfilechooser.h \
- /usr/include/gtk-2.0/gtk/gtkfilefilter.h \
- /usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h \
- /usr/include/gtk-2.0/gtk/gtkhbox.h \
- /usr/include/gtk-2.0/gtk/gtkfilechooserdialog.h \
- /usr/include/gtk-2.0/gtk/gtkfilechooserwidget.h \
- /usr/include/gtk-2.0/gtk/gtkfontbutton.h \
- /usr/include/gtk-2.0/gtk/gtkfontsel.h /usr/include/gtk-2.0/gtk/gtkgc.h \
- /usr/include/gtk-2.0/gtk/gtkhandlebox.h \
- /usr/include/gtk-2.0/gtk/gtkhbbox.h /usr/include/gtk-2.0/gtk/gtkhpaned.h \
- /usr/include/gtk-2.0/gtk/gtkpaned.h /usr/include/gtk-2.0/gtk/gtkhruler.h \
- /usr/include/gtk-2.0/gtk/gtkruler.h /usr/include/gtk-2.0/gtk/gtkhscale.h \
- /usr/include/gtk-2.0/gtk/gtkscale.h /usr/include/gtk-2.0/gtk/gtkrange.h \
- /usr/include/gtk-2.0/gtk/gtkhscrollbar.h \
- /usr/include/gtk-2.0/gtk/gtkscrollbar.h \
- /usr/include/gtk-2.0/gtk/gtkhseparator.h \
- /usr/include/gtk-2.0/gtk/gtkseparator.h \
- /usr/include/gtk-2.0/gtk/gtkhsv.h \
- /usr/include/gtk-2.0/gtk/gtkiconfactory.h \
- /usr/include/gtk-2.0/gtk/gtkicontheme.h \
- /usr/include/gtk-2.0/gtk/gtkiconview.h \
- /usr/include/gtk-2.0/gtk/gtktooltip.h \
- /usr/include/gtk-2.0/gtk/gtkimagemenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkimcontextsimple.h \
- /usr/include/gtk-2.0/gtk/gtkimmulticontext.h \
- /usr/include/gtk-2.0/gtk/gtkinfobar.h \
- /usr/include/gtk-2.0/gtk/gtkinvisible.h \
- /usr/include/gtk-2.0/gtk/gtklayout.h \
- /usr/include/gtk-2.0/gtk/gtklinkbutton.h \
- /usr/include/gtk-2.0/gtk/gtkmain.h /usr/include/gtk-2.0/gtk/gtkmenubar.h \
- /usr/include/gtk-2.0/gtk/gtkmenutoolbutton.h \
- /usr/include/gtk-2.0/gtk/gtktoolbutton.h \
- /usr/include/gtk-2.0/gtk/gtktoolitem.h \
- /usr/include/gtk-2.0/gtk/gtktooltips.h \
- /usr/include/gtk-2.0/gtk/gtksizegroup.h \
- /usr/include/gtk-2.0/gtk/gtkmessagedialog.h \
- /usr/include/gtk-2.0/gtk/gtkmodules.h \
- /usr/include/gtk-2.0/gtk/gtkmountoperation.h \
- /usr/include/gtk-2.0/gtk/gtknotebook.h \
- /usr/include/gtk-2.0/gtk/gtkoffscreenwindow.h \
- /usr/include/gtk-2.0/gtk/gtkorientable.h \
- /usr/include/gtk-2.0/gtk/gtkpagesetup.h \
- /usr/include/gtk-2.0/gtk/gtkpapersize.h \
- /usr/include/gtk-2.0/gtk/gtkplug.h /usr/include/gtk-2.0/gtk/gtksocket.h \
- /usr/include/gtk-2.0/gtk/gtkprintcontext.h \
- /usr/include/gtk-2.0/gtk/gtkprintoperation.h \
- /usr/include/gtk-2.0/gtk/gtkprintsettings.h \
- /usr/include/gtk-2.0/gtk/gtkprintoperationpreview.h \
- /usr/include/gtk-2.0/gtk/gtkprogressbar.h \
- /usr/include/gtk-2.0/gtk/gtkprogress.h \
- /usr/include/gtk-2.0/gtk/gtkradioaction.h \
- /usr/include/gtk-2.0/gtk/gtktoggleaction.h \
- /usr/include/gtk-2.0/gtk/gtkradiobutton.h \
- /usr/include/gtk-2.0/gtk/gtkradiomenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkradiotoolbutton.h \
- /usr/include/gtk-2.0/gtk/gtktoggletoolbutton.h \
- /usr/include/gtk-2.0/gtk/gtkrecentaction.h \
- /usr/include/gtk-2.0/gtk/gtkrecentmanager.h \
- /usr/include/gtk-2.0/gtk/gtkrecentchooser.h \
- /usr/include/gtk-2.0/gtk/gtkrecentfilter.h \
- /usr/include/gtk-2.0/gtk/gtkrecentchooserdialog.h \
- /usr/include/gtk-2.0/gtk/gtkrecentchoosermenu.h \
- /usr/include/gtk-2.0/gtk/gtkrecentchooserwidget.h \
- /usr/include/gtk-2.0/gtk/gtkscalebutton.h \
- /usr/include/gtk-2.0/gtk/gtkscrolledwindow.h \
- /usr/include/gtk-2.0/gtk/gtkvscrollbar.h \
- /usr/include/gtk-2.0/gtk/gtkviewport.h \
- /usr/include/gtk-2.0/gtk/gtkseparatormenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkseparatortoolitem.h \
- /usr/include/gtk-2.0/gtk/gtkshow.h \
- /usr/include/gtk-2.0/gtk/gtkspinbutton.h \
- /usr/include/gtk-2.0/gtk/gtkspinner.h \
- /usr/include/gtk-2.0/gtk/gtkstatusbar.h \
- /usr/include/gtk-2.0/gtk/gtkstatusicon.h \
- /usr/include/gtk-2.0/gtk/gtkstock.h /usr/include/gtk-2.0/gtk/gtktable.h \
- /usr/include/gtk-2.0/gtk/gtktearoffmenuitem.h \
- /usr/include/gtk-2.0/gtk/gtktextbuffer.h \
- /usr/include/gtk-2.0/gtk/gtktexttagtable.h \
- /usr/include/gtk-2.0/gtk/gtktextmark.h \
- /usr/include/gtk-2.0/gtk/gtktextbufferrichtext.h \
- /usr/include/gtk-2.0/gtk/gtktextview.h \
- /usr/include/gtk-2.0/gtk/gtktoolbar.h \
- /usr/include/gtk-2.0/gtk/gtkpixmap.h \
- /usr/include/gtk-2.0/gtk/gtktoolitemgroup.h \
- /usr/include/gtk-2.0/gtk/gtktoolpalette.h \
- /usr/include/gtk-2.0/gtk/gtktoolshell.h \
- /usr/include/gtk-2.0/gtk/gtktestutils.h \
- /usr/include/gtk-2.0/gtk/gtktreednd.h \
- /usr/include/gtk-2.0/gtk/gtktreemodelsort.h \
- /usr/include/gtk-2.0/gtk/gtktreeselection.h \
- /usr/include/gtk-2.0/gtk/gtktreestore.h \
- /usr/include/gtk-2.0/gtk/gtkuimanager.h \
- /usr/include/gtk-2.0/gtk/gtkvbbox.h \
- /usr/include/gtk-2.0/gtk/gtkversion.h \
- /usr/include/gtk-2.0/gtk/gtkvolumebutton.h \
- /usr/include/gtk-2.0/gtk/gtkvpaned.h \
- /usr/include/gtk-2.0/gtk/gtkvruler.h \
- /usr/include/gtk-2.0/gtk/gtkvscale.h \
- /usr/include/gtk-2.0/gtk/gtkvseparator.h \
- /usr/include/gtk-2.0/gtk/gtktext.h /usr/include/gtk-2.0/gtk/gtktree.h \
- /usr/include/gtk-2.0/gtk/gtktreeitem.h \
- /usr/include/gtk-2.0/gtk/gtkclist.h /usr/include/gtk-2.0/gtk/gtkcombo.h \
- /usr/include/gtk-2.0/gtk/gtkctree.h /usr/include/gtk-2.0/gtk/gtkcurve.h \
- /usr/include/gtk-2.0/gtk/gtkfilesel.h \
- /usr/include/gtk-2.0/gtk/gtkgamma.h \
- /usr/include/gtk-2.0/gtk/gtkinputdialog.h \
- /usr/include/gtk-2.0/gtk/gtkitemfactory.h \
- /usr/include/gtk-2.0/gtk/gtklist.h \
- /usr/include/gtk-2.0/gtk/gtklistitem.h \
- /usr/include/gtk-2.0/gtk/gtkoldeditable.h \
- /usr/include/gtk-2.0/gtk/gtkoptionmenu.h \
- /usr/include/gtk-2.0/gtk/gtkpreview.h \
- /usr/include/gtk-2.0/gtk/gtktipsquery.h \
- /usr/include/gtk-2.0/gdk/gdkkeysyms.h \
- /usr/include/gtk-2.0/gdk/gdkkeysyms-compat.h lazyfixed.h sysdep.h \
- vlazyfixed.h client.h game.h tiles.h tiles-enums.h player.h \
- player-enums.h protocol.h cmsg_union.h pmsg_union.h protocol-enums.h \
- game-enums.h version.h gtkrc.h
-gui-dial.o: gui-dial.c gui.h /usr/include/gtk-2.0/gtk/gtk.h \
- /usr/include/gtk-2.0/gdk/gdk.h \
- /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h \
- /usr/include/glib-2.0/gio/gio.h /usr/include/glib-2.0/gio/giotypes.h \
- /usr/include/glib-2.0/gio/gioenums.h /usr/include/glib-2.0/glib-object.h \
- /usr/include/glib-2.0/gobject/gbinding.h /usr/include/glib-2.0/glib.h \
- /usr/include/glib-2.0/glib/galloca.h /usr/include/glib-2.0/glib/gtypes.h \
- /usr/lib/glib-2.0/include/glibconfig.h \
- /usr/include/glib-2.0/glib/gmacros.h /usr/include/glib-2.0/glib/garray.h \
- /usr/include/glib-2.0/glib/gasyncqueue.h \
- /usr/include/glib-2.0/glib/gthread.h /usr/include/glib-2.0/glib/gerror.h \
- /usr/include/glib-2.0/glib/gquark.h /usr/include/glib-2.0/glib/gutils.h \
- /usr/include/glib-2.0/glib/gatomic.h \
- /usr/include/glib-2.0/glib/gbacktrace.h \
- /usr/include/glib-2.0/glib/gbase64.h \
- /usr/include/glib-2.0/glib/gbitlock.h \
- /usr/include/glib-2.0/glib/gbookmarkfile.h \
- /usr/include/glib-2.0/glib/gcache.h /usr/include/glib-2.0/glib/glist.h \
- /usr/include/glib-2.0/glib/gmem.h /usr/include/glib-2.0/glib/gslice.h \
- /usr/include/glib-2.0/glib/gchecksum.h \
- /usr/include/glib-2.0/glib/gcompletion.h \
- /usr/include/glib-2.0/glib/gconvert.h \
- /usr/include/glib-2.0/glib/gdataset.h /usr/include/glib-2.0/glib/gdate.h \
- /usr/include/glib-2.0/glib/gdatetime.h \
- /usr/include/glib-2.0/glib/gtimezone.h /usr/include/glib-2.0/glib/gdir.h \
- /usr/include/glib-2.0/glib/gfileutils.h \
- /usr/include/glib-2.0/glib/ghash.h /usr/include/glib-2.0/glib/ghook.h \
- /usr/include/glib-2.0/glib/ghostutils.h \
- /usr/include/glib-2.0/glib/giochannel.h \
- /usr/include/glib-2.0/glib/gmain.h /usr/include/glib-2.0/glib/gpoll.h \
- /usr/include/glib-2.0/glib/gslist.h /usr/include/glib-2.0/glib/gstring.h \
- /usr/include/glib-2.0/glib/gunicode.h \
- /usr/include/glib-2.0/glib/gkeyfile.h \
- /usr/include/glib-2.0/glib/gmappedfile.h \
- /usr/include/glib-2.0/glib/gmarkup.h \
- /usr/include/glib-2.0/glib/gmessages.h \
- /usr/include/glib-2.0/glib/gnode.h /usr/include/glib-2.0/glib/goption.h \
- /usr/include/glib-2.0/glib/gpattern.h \
- /usr/include/glib-2.0/glib/gprimes.h /usr/include/glib-2.0/glib/gqsort.h \
- /usr/include/glib-2.0/glib/gqueue.h /usr/include/glib-2.0/glib/grand.h \
- /usr/include/glib-2.0/glib/grel.h /usr/include/glib-2.0/glib/gregex.h \
- /usr/include/glib-2.0/glib/gscanner.h \
- /usr/include/glib-2.0/glib/gsequence.h \
- /usr/include/glib-2.0/glib/gshell.h /usr/include/glib-2.0/glib/gspawn.h \
- /usr/include/glib-2.0/glib/gstrfuncs.h \
- /usr/include/glib-2.0/glib/gtestutils.h \
- /usr/include/glib-2.0/glib/gthreadpool.h \
- /usr/include/glib-2.0/glib/gtimer.h /usr/include/glib-2.0/glib/gtree.h \
- /usr/include/glib-2.0/glib/gurifuncs.h \
- /usr/include/glib-2.0/glib/gvarianttype.h \
- /usr/include/glib-2.0/glib/gvariant.h \
- /usr/include/glib-2.0/gobject/gobject.h \
- /usr/include/glib-2.0/gobject/gtype.h \
- /usr/include/glib-2.0/gobject/gvalue.h \
- /usr/include/glib-2.0/gobject/gparam.h \
- /usr/include/glib-2.0/gobject/gclosure.h \
- /usr/include/glib-2.0/gobject/gsignal.h \
- /usr/include/glib-2.0/gobject/gmarshal.h \
- /usr/include/glib-2.0/gobject/gboxed.h \
- /usr/include/glib-2.0/gobject/genums.h \
- /usr/include/glib-2.0/gobject/gparamspecs.h \
- /usr/include/glib-2.0/gobject/gsourceclosure.h \
- /usr/include/glib-2.0/gobject/gtypemodule.h \
- /usr/include/glib-2.0/gobject/gtypeplugin.h \
- /usr/include/glib-2.0/gobject/gvaluearray.h \
- /usr/include/glib-2.0/gobject/gvaluetypes.h \
- /usr/include/glib-2.0/gio/gappinfo.h /usr/include/glib-2.0/gio/gaction.h \
- /usr/include/glib-2.0/gio/gsimpleaction.h \
- /usr/include/glib-2.0/gio/gactiongroup.h \
- /usr/include/glib-2.0/gio/gsimpleactiongroup.h \
- /usr/include/glib-2.0/gio/gactiongroup.h \
- /usr/include/glib-2.0/gio/gapplication.h \
- /usr/include/glib-2.0/gio/gapplicationcommandline.h \
- /usr/include/glib-2.0/gio/gasyncinitable.h \
- /usr/include/glib-2.0/gio/ginitable.h \
- /usr/include/glib-2.0/gio/gasyncresult.h \
- /usr/include/glib-2.0/gio/gbufferedinputstream.h \
- /usr/include/glib-2.0/gio/gfilterinputstream.h \
- /usr/include/glib-2.0/gio/ginputstream.h \
- /usr/include/glib-2.0/gio/gbufferedoutputstream.h \
- /usr/include/glib-2.0/gio/gfilteroutputstream.h \
- /usr/include/glib-2.0/gio/goutputstream.h \
- /usr/include/glib-2.0/gio/gcancellable.h \
- /usr/include/glib-2.0/gio/gcharsetconverter.h \
- /usr/include/glib-2.0/gio/gconverter.h \
- /usr/include/glib-2.0/gio/gcontenttype.h \
- /usr/include/glib-2.0/gio/gconverterinputstream.h \
- /usr/include/glib-2.0/gio/gconverteroutputstream.h \
- /usr/include/glib-2.0/gio/gcredentials.h \
- /usr/include/glib-2.0/gio/gdatainputstream.h \
- /usr/include/glib-2.0/gio/gdataoutputstream.h \
- /usr/include/glib-2.0/gio/gdbusaddress.h \
- /usr/include/glib-2.0/gio/gdbusauthobserver.h \
- /usr/include/glib-2.0/gio/gdbusconnection.h \
- /usr/include/glib-2.0/gio/gdbuserror.h \
- /usr/include/glib-2.0/gio/gdbusintrospection.h \
- /usr/include/glib-2.0/gio/gdbusmessage.h \
- /usr/include/glib-2.0/gio/gdbusmethodinvocation.h \
- /usr/include/glib-2.0/gio/gdbusnameowning.h \
- /usr/include/glib-2.0/gio/gdbusnamewatching.h \
- /usr/include/glib-2.0/gio/gdbusproxy.h \
- /usr/include/glib-2.0/gio/gdbusserver.h \
- /usr/include/glib-2.0/gio/gdbusutils.h \
- /usr/include/glib-2.0/gio/gdrive.h \
- /usr/include/glib-2.0/gio/gemblemedicon.h \
- /usr/include/glib-2.0/gio/gicon.h /usr/include/glib-2.0/gio/gemblem.h \
- /usr/include/glib-2.0/gio/gfileattribute.h \
- /usr/include/glib-2.0/gio/gfileenumerator.h \
- /usr/include/glib-2.0/gio/gfile.h /usr/include/glib-2.0/gio/gfileicon.h \
- /usr/include/glib-2.0/gio/gfileinfo.h \
- /usr/include/glib-2.0/gio/gfileinputstream.h \
- /usr/include/glib-2.0/gio/gfileiostream.h \
- /usr/include/glib-2.0/gio/giostream.h \
- /usr/include/glib-2.0/gio/gioerror.h \
- /usr/include/glib-2.0/gio/gfilemonitor.h \
- /usr/include/glib-2.0/gio/gfilenamecompleter.h \
- /usr/include/glib-2.0/gio/gfileoutputstream.h \
- /usr/include/glib-2.0/gio/ginetaddress.h \
- /usr/include/glib-2.0/gio/ginetsocketaddress.h \
- /usr/include/glib-2.0/gio/gsocketaddress.h \
- /usr/include/glib-2.0/gio/gioenumtypes.h \
- /usr/include/glib-2.0/gio/giomodule.h /usr/include/glib-2.0/gmodule.h \
- /usr/include/glib-2.0/gio/gioscheduler.h \
- /usr/include/glib-2.0/gio/gloadableicon.h \
- /usr/include/glib-2.0/gio/gmemoryinputstream.h \
- /usr/include/glib-2.0/gio/gmemoryoutputstream.h \
- /usr/include/glib-2.0/gio/gmount.h \
- /usr/include/glib-2.0/gio/gmountoperation.h \
- /usr/include/glib-2.0/gio/gnativevolumemonitor.h \
- /usr/include/glib-2.0/gio/gvolumemonitor.h \
- /usr/include/glib-2.0/gio/gnetworkaddress.h \
- /usr/include/glib-2.0/gio/gnetworkservice.h \
- /usr/include/glib-2.0/gio/gpermission.h \
- /usr/include/glib-2.0/gio/gpollableinputstream.h \
- /usr/include/glib-2.0/gio/gpollableoutputstream.h \
- /usr/include/glib-2.0/gio/gproxy.h \
- /usr/include/glib-2.0/gio/gproxyaddress.h \
- /usr/include/glib-2.0/gio/gproxyaddressenumerator.h \
- /usr/include/glib-2.0/gio/gsocketaddressenumerator.h \
- /usr/include/glib-2.0/gio/gproxyresolver.h \
- /usr/include/glib-2.0/gio/gresolver.h \
- /usr/include/glib-2.0/gio/gseekable.h \
- /usr/include/glib-2.0/gio/gsettings.h \
- /usr/include/glib-2.0/gio/gsimpleasyncresult.h \
- /usr/include/glib-2.0/gio/gsimplepermission.h \
- /usr/include/glib-2.0/gio/gsocketclient.h \
- /usr/include/glib-2.0/gio/gsocketconnectable.h \
- /usr/include/glib-2.0/gio/gsocketconnection.h \
- /usr/include/glib-2.0/gio/gsocket.h \
- /usr/include/glib-2.0/gio/gsocketcontrolmessage.h \
- /usr/include/glib-2.0/gio/gsocketlistener.h \
- /usr/include/glib-2.0/gio/gsocketservice.h \
- /usr/include/glib-2.0/gio/gsrvtarget.h \
- /usr/include/glib-2.0/gio/gtcpconnection.h \
- /usr/include/glib-2.0/gio/gtcpwrapperconnection.h \
- /usr/include/glib-2.0/gio/gthemedicon.h \
- /usr/include/glib-2.0/gio/gthreadedsocketservice.h \
- /usr/include/glib-2.0/gio/gtlsbackend.h \
- /usr/include/glib-2.0/gio/gtlscertificate.h \
- /usr/include/glib-2.0/gio/gtlsclientconnection.h \
- /usr/include/glib-2.0/gio/gtlsconnection.h \
- /usr/include/glib-2.0/gio/gtlsserverconnection.h \
- /usr/include/glib-2.0/gio/gvfs.h /usr/include/glib-2.0/gio/gvolume.h \
- /usr/include/glib-2.0/gio/gzlibcompressor.h \
- /usr/include/glib-2.0/gio/gzlibdecompressor.h \
- /usr/include/gtk-2.0/gdk/gdkscreen.h /usr/include/cairo/cairo.h \
- /usr/include/cairo/cairo-version.h /usr/include/cairo/cairo-features.h \
- /usr/include/cairo/cairo-deprecated.h \
- /usr/include/gtk-2.0/gdk/gdktypes.h /usr/include/pango-1.0/pango/pango.h \
- /usr/include/pango-1.0/pango/pango-attributes.h \
- /usr/include/pango-1.0/pango/pango-font.h \
- /usr/include/pango-1.0/pango/pango-coverage.h \
- /usr/include/pango-1.0/pango/pango-types.h \
- /usr/include/pango-1.0/pango/pango-gravity.h \
- /usr/include/pango-1.0/pango/pango-matrix.h \
- /usr/include/pango-1.0/pango/pango-script.h \
- /usr/include/pango-1.0/pango/pango-language.h \
- /usr/include/pango-1.0/pango/pango-bidi-type.h \
- /usr/include/pango-1.0/pango/pango-break.h \
- /usr/include/pango-1.0/pango/pango-item.h \
- /usr/include/pango-1.0/pango/pango-context.h \
- /usr/include/pango-1.0/pango/pango-fontmap.h \
- /usr/include/pango-1.0/pango/pango-fontset.h \
- /usr/include/pango-1.0/pango/pango-engine.h \
- /usr/include/pango-1.0/pango/pango-glyph.h \
- /usr/include/pango-1.0/pango/pango-enum-types.h \
- /usr/include/pango-1.0/pango/pango-features.h \
- /usr/include/pango-1.0/pango/pango-glyph-item.h \
- /usr/include/pango-1.0/pango/pango-layout.h \
- /usr/include/pango-1.0/pango/pango-tabs.h \
- /usr/include/pango-1.0/pango/pango-renderer.h \
- /usr/include/pango-1.0/pango/pango-utils.h \
- /usr/lib/gtk-2.0/include/gdkconfig.h \
- /usr/include/gtk-2.0/gdk/gdkdisplay.h \
- /usr/include/gtk-2.0/gdk/gdkevents.h /usr/include/gtk-2.0/gdk/gdkcolor.h \
- /usr/include/gtk-2.0/gdk/gdkdnd.h /usr/include/gtk-2.0/gdk/gdkinput.h \
- /usr/include/gtk-2.0/gdk/gdkcairo.h /usr/include/gtk-2.0/gdk/gdkpixbuf.h \
- /usr/include/gtk-2.0/gdk/gdkrgb.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-features.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-core.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-transform.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-animation.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-simple-anim.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-io.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-loader.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-enum-types.h \
- /usr/include/pango-1.0/pango/pangocairo.h \
- /usr/include/gtk-2.0/gdk/gdkcursor.h \
- /usr/include/gtk-2.0/gdk/gdkdisplaymanager.h \
- /usr/include/gtk-2.0/gdk/gdkdrawable.h /usr/include/gtk-2.0/gdk/gdkgc.h \
- /usr/include/gtk-2.0/gdk/gdkenumtypes.h \
- /usr/include/gtk-2.0/gdk/gdkfont.h /usr/include/gtk-2.0/gdk/gdkimage.h \
- /usr/include/gtk-2.0/gdk/gdkkeys.h /usr/include/gtk-2.0/gdk/gdkpango.h \
- /usr/include/gtk-2.0/gdk/gdkpixmap.h \
- /usr/include/gtk-2.0/gdk/gdkproperty.h \
- /usr/include/gtk-2.0/gdk/gdkregion.h \
- /usr/include/gtk-2.0/gdk/gdkselection.h \
- /usr/include/gtk-2.0/gdk/gdkspawn.h \
- /usr/include/gtk-2.0/gdk/gdktestutils.h \
- /usr/include/gtk-2.0/gdk/gdkwindow.h \
- /usr/include/gtk-2.0/gdk/gdkvisual.h \
- /usr/include/gtk-2.0/gtk/gtkaboutdialog.h \
- /usr/include/gtk-2.0/gtk/gtkdialog.h \
- /usr/include/gtk-2.0/gtk/gtkwindow.h \
- /usr/include/gtk-2.0/gtk/gtkaccelgroup.h \
- /usr/include/gtk-2.0/gtk/gtkenums.h /usr/include/gtk-2.0/gtk/gtkbin.h \
- /usr/include/gtk-2.0/gtk/gtkcontainer.h \
- /usr/include/gtk-2.0/gtk/gtkwidget.h \
- /usr/include/gtk-2.0/gtk/gtkobject.h \
- /usr/include/gtk-2.0/gtk/gtktypeutils.h \
- /usr/include/gtk-2.0/gtk/gtktypebuiltins.h \
- /usr/include/gtk-2.0/gtk/gtkdebug.h \
- /usr/include/gtk-2.0/gtk/gtkadjustment.h \
- /usr/include/gtk-2.0/gtk/gtkstyle.h \
- /usr/include/gtk-2.0/gtk/gtksettings.h /usr/include/gtk-2.0/gtk/gtkrc.h \
- /usr/include/atk-1.0/atk/atk.h /usr/include/atk-1.0/atk/atkobject.h \
- /usr/include/atk-1.0/atk/atkstate.h \
- /usr/include/atk-1.0/atk/atkrelationtype.h \
- /usr/include/atk-1.0/atk/atkaction.h \
- /usr/include/atk-1.0/atk/atkcomponent.h \
- /usr/include/atk-1.0/atk/atkutil.h \
- /usr/include/atk-1.0/atk/atkdocument.h \
- /usr/include/atk-1.0/atk/atkeditabletext.h \
- /usr/include/atk-1.0/atk/atktext.h \
- /usr/include/atk-1.0/atk/atkgobjectaccessible.h \
- /usr/include/atk-1.0/atk/atkhyperlink.h \
- /usr/include/atk-1.0/atk/atkhyperlinkimpl.h \
- /usr/include/atk-1.0/atk/atkhypertext.h \
- /usr/include/atk-1.0/atk/atkimage.h \
- /usr/include/atk-1.0/atk/atknoopobject.h \
- /usr/include/atk-1.0/atk/atknoopobjectfactory.h \
- /usr/include/atk-1.0/atk/atkobjectfactory.h \
- /usr/include/atk-1.0/atk/atkplug.h \
- /usr/include/atk-1.0/atk/atkregistry.h \
- /usr/include/atk-1.0/atk/atkobjectfactory.h \
- /usr/include/atk-1.0/atk/atkrelation.h \
- /usr/include/atk-1.0/atk/atkrelationset.h \
- /usr/include/atk-1.0/atk/atkselection.h \
- /usr/include/atk-1.0/atk/atksocket.h \
- /usr/include/atk-1.0/atk/atkstateset.h \
- /usr/include/atk-1.0/atk/atkstreamablecontent.h \
- /usr/include/atk-1.0/atk/atktable.h /usr/include/atk-1.0/atk/atkmisc.h \
- /usr/include/atk-1.0/atk/atkvalue.h \
- /usr/include/gtk-2.0/gtk/gtkaccellabel.h \
- /usr/include/gtk-2.0/gtk/gtklabel.h /usr/include/gtk-2.0/gtk/gtkmisc.h \
- /usr/include/gtk-2.0/gtk/gtkmenu.h \
- /usr/include/gtk-2.0/gtk/gtkmenushell.h \
- /usr/include/gtk-2.0/gtk/gtkaccelmap.h \
- /usr/include/gtk-2.0/gtk/gtkaccessible.h \
- /usr/include/gtk-2.0/gtk/gtkaction.h \
- /usr/include/gtk-2.0/gtk/gtkactiongroup.h \
- /usr/include/gtk-2.0/gtk/gtkactivatable.h \
- /usr/include/gtk-2.0/gtk/gtkalignment.h \
- /usr/include/gtk-2.0/gtk/gtkarrow.h \
- /usr/include/gtk-2.0/gtk/gtkaspectframe.h \
- /usr/include/gtk-2.0/gtk/gtkframe.h \
- /usr/include/gtk-2.0/gtk/gtkassistant.h \
- /usr/include/gtk-2.0/gtk/gtkbbox.h /usr/include/gtk-2.0/gtk/gtkbox.h \
- /usr/include/gtk-2.0/gtk/gtkbindings.h \
- /usr/include/gtk-2.0/gtk/gtkbuildable.h \
- /usr/include/gtk-2.0/gtk/gtkbuilder.h \
- /usr/include/gtk-2.0/gtk/gtkbutton.h /usr/include/gtk-2.0/gtk/gtkimage.h \
- /usr/include/gtk-2.0/gtk/gtkcalendar.h \
- /usr/include/gtk-2.0/gtk/gtksignal.h \
- /usr/include/gtk-2.0/gtk/gtkmarshal.h \
- /usr/include/gtk-2.0/gtk/gtkcelleditable.h \
- /usr/include/gtk-2.0/gtk/gtkcelllayout.h \
- /usr/include/gtk-2.0/gtk/gtkcellrenderer.h \
- /usr/include/gtk-2.0/gtk/gtktreeviewcolumn.h \
- /usr/include/gtk-2.0/gtk/gtktreemodel.h \
- /usr/include/gtk-2.0/gtk/gtktreesortable.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendereraccel.h \
- /usr/include/gtk-2.0/gtk/gtkcellrenderertext.h \
- /usr/include/gtk-2.0/gtk/gtkcellrenderercombo.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendererpixbuf.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendererprogress.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendererspin.h \
- /usr/include/gtk-2.0/gtk/gtkcellrendererspinner.h \
- /usr/include/gtk-2.0/gtk/gtkcellrenderertoggle.h \
- /usr/include/gtk-2.0/gtk/gtkcellview.h \
- /usr/include/gtk-2.0/gtk/gtkcheckbutton.h \
- /usr/include/gtk-2.0/gtk/gtktogglebutton.h \
- /usr/include/gtk-2.0/gtk/gtkcheckmenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkmenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkitem.h \
- /usr/include/gtk-2.0/gtk/gtkclipboard.h \
- /usr/include/gtk-2.0/gtk/gtkselection.h \
- /usr/include/gtk-2.0/gtk/gtktextiter.h \
- /usr/include/gtk-2.0/gtk/gtktexttag.h \
- /usr/include/gtk-2.0/gtk/gtktextchild.h \
- /usr/include/gtk-2.0/gtk/gtkcolorbutton.h \
- /usr/include/gtk-2.0/gtk/gtkcolorsel.h \
- /usr/include/gtk-2.0/gtk/gtkvbox.h \
- /usr/include/gtk-2.0/gtk/gtkcolorseldialog.h \
- /usr/include/gtk-2.0/gtk/gtkcombobox.h \
- /usr/include/gtk-2.0/gtk/gtktreeview.h /usr/include/gtk-2.0/gtk/gtkdnd.h \
- /usr/include/gtk-2.0/gtk/gtkentry.h \
- /usr/include/gtk-2.0/gtk/gtkeditable.h \
- /usr/include/gtk-2.0/gtk/gtkimcontext.h \
- /usr/include/gtk-2.0/gtk/gtkentrybuffer.h \
- /usr/include/gtk-2.0/gtk/gtkentrycompletion.h \
- /usr/include/gtk-2.0/gtk/gtkliststore.h \
- /usr/include/gtk-2.0/gtk/gtktreemodelfilter.h \
- /usr/include/gtk-2.0/gtk/gtkcomboboxentry.h \
- /usr/include/gtk-2.0/gtk/gtkdrawingarea.h \
- /usr/include/gtk-2.0/gtk/gtkeventbox.h \
- /usr/include/gtk-2.0/gtk/gtkexpander.h \
- /usr/include/gtk-2.0/gtk/gtkfixed.h \
- /usr/include/gtk-2.0/gtk/gtkfilechooser.h \
- /usr/include/gtk-2.0/gtk/gtkfilefilter.h \
- /usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h \
- /usr/include/gtk-2.0/gtk/gtkhbox.h \
- /usr/include/gtk-2.0/gtk/gtkfilechooserdialog.h \
- /usr/include/gtk-2.0/gtk/gtkfilechooserwidget.h \
- /usr/include/gtk-2.0/gtk/gtkfontbutton.h \
- /usr/include/gtk-2.0/gtk/gtkfontsel.h /usr/include/gtk-2.0/gtk/gtkgc.h \
- /usr/include/gtk-2.0/gtk/gtkhandlebox.h \
- /usr/include/gtk-2.0/gtk/gtkhbbox.h /usr/include/gtk-2.0/gtk/gtkhpaned.h \
- /usr/include/gtk-2.0/gtk/gtkpaned.h /usr/include/gtk-2.0/gtk/gtkhruler.h \
- /usr/include/gtk-2.0/gtk/gtkruler.h /usr/include/gtk-2.0/gtk/gtkhscale.h \
- /usr/include/gtk-2.0/gtk/gtkscale.h /usr/include/gtk-2.0/gtk/gtkrange.h \
- /usr/include/gtk-2.0/gtk/gtkhscrollbar.h \
- /usr/include/gtk-2.0/gtk/gtkscrollbar.h \
- /usr/include/gtk-2.0/gtk/gtkhseparator.h \
- /usr/include/gtk-2.0/gtk/gtkseparator.h \
- /usr/include/gtk-2.0/gtk/gtkhsv.h \
- /usr/include/gtk-2.0/gtk/gtkiconfactory.h \
- /usr/include/gtk-2.0/gtk/gtkicontheme.h \
- /usr/include/gtk-2.0/gtk/gtkiconview.h \
- /usr/include/gtk-2.0/gtk/gtktooltip.h \
- /usr/include/gtk-2.0/gtk/gtkimagemenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkimcontextsimple.h \
- /usr/include/gtk-2.0/gtk/gtkimmulticontext.h \
- /usr/include/gtk-2.0/gtk/gtkinfobar.h \
- /usr/include/gtk-2.0/gtk/gtkinvisible.h \
- /usr/include/gtk-2.0/gtk/gtklayout.h \
- /usr/include/gtk-2.0/gtk/gtklinkbutton.h \
- /usr/include/gtk-2.0/gtk/gtkmain.h /usr/include/gtk-2.0/gtk/gtkmenubar.h \
- /usr/include/gtk-2.0/gtk/gtkmenutoolbutton.h \
- /usr/include/gtk-2.0/gtk/gtktoolbutton.h \
- /usr/include/gtk-2.0/gtk/gtktoolitem.h \
- /usr/include/gtk-2.0/gtk/gtktooltips.h \
- /usr/include/gtk-2.0/gtk/gtksizegroup.h \
- /usr/include/gtk-2.0/gtk/gtkmessagedialog.h \
- /usr/include/gtk-2.0/gtk/gtkmodules.h \
- /usr/include/gtk-2.0/gtk/gtkmountoperation.h \
- /usr/include/gtk-2.0/gtk/gtknotebook.h \
- /usr/include/gtk-2.0/gtk/gtkoffscreenwindow.h \
- /usr/include/gtk-2.0/gtk/gtkorientable.h \
- /usr/include/gtk-2.0/gtk/gtkpagesetup.h \
- /usr/include/gtk-2.0/gtk/gtkpapersize.h \
- /usr/include/gtk-2.0/gtk/gtkplug.h /usr/include/gtk-2.0/gtk/gtksocket.h \
- /usr/include/gtk-2.0/gtk/gtkprintcontext.h \
- /usr/include/gtk-2.0/gtk/gtkprintoperation.h \
- /usr/include/gtk-2.0/gtk/gtkprintsettings.h \
- /usr/include/gtk-2.0/gtk/gtkprintoperationpreview.h \
- /usr/include/gtk-2.0/gtk/gtkprogressbar.h \
- /usr/include/gtk-2.0/gtk/gtkprogress.h \
- /usr/include/gtk-2.0/gtk/gtkradioaction.h \
- /usr/include/gtk-2.0/gtk/gtktoggleaction.h \
- /usr/include/gtk-2.0/gtk/gtkradiobutton.h \
- /usr/include/gtk-2.0/gtk/gtkradiomenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkradiotoolbutton.h \
- /usr/include/gtk-2.0/gtk/gtktoggletoolbutton.h \
- /usr/include/gtk-2.0/gtk/gtkrecentaction.h \
- /usr/include/gtk-2.0/gtk/gtkrecentmanager.h \
- /usr/include/gtk-2.0/gtk/gtkrecentchooser.h \
- /usr/include/gtk-2.0/gtk/gtkrecentfilter.h \
- /usr/include/gtk-2.0/gtk/gtkrecentchooserdialog.h \
- /usr/include/gtk-2.0/gtk/gtkrecentchoosermenu.h \
- /usr/include/gtk-2.0/gtk/gtkrecentchooserwidget.h \
- /usr/include/gtk-2.0/gtk/gtkscalebutton.h \
- /usr/include/gtk-2.0/gtk/gtkscrolledwindow.h \
- /usr/include/gtk-2.0/gtk/gtkvscrollbar.h \
- /usr/include/gtk-2.0/gtk/gtkviewport.h \
- /usr/include/gtk-2.0/gtk/gtkseparatormenuitem.h \
- /usr/include/gtk-2.0/gtk/gtkseparatortoolitem.h \
- /usr/include/gtk-2.0/gtk/gtkshow.h \
- /usr/include/gtk-2.0/gtk/gtkspinbutton.h \
- /usr/include/gtk-2.0/gtk/gtkspinner.h \
- /usr/include/gtk-2.0/gtk/gtkstatusbar.h \
- /usr/include/gtk-2.0/gtk/gtkstatusicon.h \
- /usr/include/gtk-2.0/gtk/gtkstock.h /usr/include/gtk-2.0/gtk/gtktable.h \
- /usr/include/gtk-2.0/gtk/gtktearoffmenuitem.h \
- /usr/include/gtk-2.0/gtk/gtktextbuffer.h \
- /usr/include/gtk-2.0/gtk/gtktexttagtable.h \
- /usr/include/gtk-2.0/gtk/gtktextmark.h \
- /usr/include/gtk-2.0/gtk/gtktextbufferrichtext.h \
- /usr/include/gtk-2.0/gtk/gtktextview.h \
- /usr/include/gtk-2.0/gtk/gtktoolbar.h \
- /usr/include/gtk-2.0/gtk/gtkpixmap.h \
- /usr/include/gtk-2.0/gtk/gtktoolitemgroup.h \
- /usr/include/gtk-2.0/gtk/gtktoolpalette.h \
- /usr/include/gtk-2.0/gtk/gtktoolshell.h \
- /usr/include/gtk-2.0/gtk/gtktestutils.h \
- /usr/include/gtk-2.0/gtk/gtktreednd.h \
- /usr/include/gtk-2.0/gtk/gtktreemodelsort.h \
- /usr/include/gtk-2.0/gtk/gtktreeselection.h \
- /usr/include/gtk-2.0/gtk/gtktreestore.h \
- /usr/include/gtk-2.0/gtk/gtkuimanager.h \
- /usr/include/gtk-2.0/gtk/gtkvbbox.h \
- /usr/include/gtk-2.0/gtk/gtkversion.h \
- /usr/include/gtk-2.0/gtk/gtkvolumebutton.h \
- /usr/include/gtk-2.0/gtk/gtkvpaned.h \
- /usr/include/gtk-2.0/gtk/gtkvruler.h \
- /usr/include/gtk-2.0/gtk/gtkvscale.h \
- /usr/include/gtk-2.0/gtk/gtkvseparator.h \
- /usr/include/gtk-2.0/gtk/gtktext.h /usr/include/gtk-2.0/gtk/gtktree.h \
- /usr/include/gtk-2.0/gtk/gtktreeitem.h \
- /usr/include/gtk-2.0/gtk/gtkclist.h /usr/include/gtk-2.0/gtk/gtkcombo.h \
- /usr/include/gtk-2.0/gtk/gtkctree.h /usr/include/gtk-2.0/gtk/gtkcurve.h \
- /usr/include/gtk-2.0/gtk/gtkfilesel.h \
- /usr/include/gtk-2.0/gtk/gtkgamma.h \
- /usr/include/gtk-2.0/gtk/gtkinputdialog.h \
- /usr/include/gtk-2.0/gtk/gtkitemfactory.h \
- /usr/include/gtk-2.0/gtk/gtklist.h \
- /usr/include/gtk-2.0/gtk/gtklistitem.h \
- /usr/include/gtk-2.0/gtk/gtkoldeditable.h \
- /usr/include/gtk-2.0/gtk/gtkoptionmenu.h \
- /usr/include/gtk-2.0/gtk/gtkpreview.h \
- /usr/include/gtk-2.0/gtk/gtktipsquery.h \
- /usr/include/gtk-2.0/gdk/gdkkeysyms.h \
- /usr/include/gtk-2.0/gdk/gdkkeysyms-compat.h lazyfixed.h sysdep.h \
- vlazyfixed.h client.h game.h tiles.h tiles-enums.h player.h \
- player-enums.h protocol.h cmsg_union.h pmsg_union.h protocol-enums.h \
- game-enums.h version.h
-lazyfixed.o: lazyfixed.c lazyfixed.h /usr/include/gtk-2.0/gtk/gtkfixed.h \
- /usr/include/gtk-2.0/gtk/gtkcontainer.h \
- /usr/include/gtk-2.0/gtk/gtkwidget.h /usr/include/gtk-2.0/gdk/gdk.h \
- /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h \
- /usr/include/glib-2.0/gio/gio.h /usr/include/glib-2.0/gio/giotypes.h \
- /usr/include/glib-2.0/gio/gioenums.h /usr/include/glib-2.0/glib-object.h \
- /usr/include/glib-2.0/gobject/gbinding.h /usr/include/glib-2.0/glib.h \
- /usr/include/glib-2.0/glib/galloca.h /usr/include/glib-2.0/glib/gtypes.h \
- /usr/lib/glib-2.0/include/glibconfig.h \
- /usr/include/glib-2.0/glib/gmacros.h /usr/include/glib-2.0/glib/garray.h \
- /usr/include/glib-2.0/glib/gasyncqueue.h \
- /usr/include/glib-2.0/glib/gthread.h /usr/include/glib-2.0/glib/gerror.h \
- /usr/include/glib-2.0/glib/gquark.h /usr/include/glib-2.0/glib/gutils.h \
- /usr/include/glib-2.0/glib/gatomic.h \
- /usr/include/glib-2.0/glib/gbacktrace.h \
- /usr/include/glib-2.0/glib/gbase64.h \
- /usr/include/glib-2.0/glib/gbitlock.h \
- /usr/include/glib-2.0/glib/gbookmarkfile.h \
- /usr/include/glib-2.0/glib/gcache.h /usr/include/glib-2.0/glib/glist.h \
- /usr/include/glib-2.0/glib/gmem.h /usr/include/glib-2.0/glib/gslice.h \
- /usr/include/glib-2.0/glib/gchecksum.h \
- /usr/include/glib-2.0/glib/gcompletion.h \
- /usr/include/glib-2.0/glib/gconvert.h \
- /usr/include/glib-2.0/glib/gdataset.h /usr/include/glib-2.0/glib/gdate.h \
- /usr/include/glib-2.0/glib/gdatetime.h \
- /usr/include/glib-2.0/glib/gtimezone.h /usr/include/glib-2.0/glib/gdir.h \
- /usr/include/glib-2.0/glib/gfileutils.h \
- /usr/include/glib-2.0/glib/ghash.h /usr/include/glib-2.0/glib/ghook.h \
- /usr/include/glib-2.0/glib/ghostutils.h \
- /usr/include/glib-2.0/glib/giochannel.h \
- /usr/include/glib-2.0/glib/gmain.h /usr/include/glib-2.0/glib/gpoll.h \
- /usr/include/glib-2.0/glib/gslist.h /usr/include/glib-2.0/glib/gstring.h \
- /usr/include/glib-2.0/glib/gunicode.h \
- /usr/include/glib-2.0/glib/gkeyfile.h \
- /usr/include/glib-2.0/glib/gmappedfile.h \
- /usr/include/glib-2.0/glib/gmarkup.h \
- /usr/include/glib-2.0/glib/gmessages.h \
- /usr/include/glib-2.0/glib/gnode.h /usr/include/glib-2.0/glib/goption.h \
- /usr/include/glib-2.0/glib/gpattern.h \
- /usr/include/glib-2.0/glib/gprimes.h /usr/include/glib-2.0/glib/gqsort.h \
- /usr/include/glib-2.0/glib/gqueue.h /usr/include/glib-2.0/glib/grand.h \
- /usr/include/glib-2.0/glib/grel.h /usr/include/glib-2.0/glib/gregex.h \
- /usr/include/glib-2.0/glib/gscanner.h \
- /usr/include/glib-2.0/glib/gsequence.h \
- /usr/include/glib-2.0/glib/gshell.h /usr/include/glib-2.0/glib/gspawn.h \
- /usr/include/glib-2.0/glib/gstrfuncs.h \
- /usr/include/glib-2.0/glib/gtestutils.h \
- /usr/include/glib-2.0/glib/gthreadpool.h \
- /usr/include/glib-2.0/glib/gtimer.h /usr/include/glib-2.0/glib/gtree.h \
- /usr/include/glib-2.0/glib/gurifuncs.h \
- /usr/include/glib-2.0/glib/gvarianttype.h \
- /usr/include/glib-2.0/glib/gvariant.h \
- /usr/include/glib-2.0/gobject/gobject.h \
- /usr/include/glib-2.0/gobject/gtype.h \
- /usr/include/glib-2.0/gobject/gvalue.h \
- /usr/include/glib-2.0/gobject/gparam.h \
- /usr/include/glib-2.0/gobject/gclosure.h \
- /usr/include/glib-2.0/gobject/gsignal.h \
- /usr/include/glib-2.0/gobject/gmarshal.h \
- /usr/include/glib-2.0/gobject/gboxed.h \
- /usr/include/glib-2.0/gobject/genums.h \
- /usr/include/glib-2.0/gobject/gparamspecs.h \
- /usr/include/glib-2.0/gobject/gsourceclosure.h \
- /usr/include/glib-2.0/gobject/gtypemodule.h \
- /usr/include/glib-2.0/gobject/gtypeplugin.h \
- /usr/include/glib-2.0/gobject/gvaluearray.h \
- /usr/include/glib-2.0/gobject/gvaluetypes.h \
- /usr/include/glib-2.0/gio/gappinfo.h /usr/include/glib-2.0/gio/gaction.h \
- /usr/include/glib-2.0/gio/gsimpleaction.h \
- /usr/include/glib-2.0/gio/gactiongroup.h \
- /usr/include/glib-2.0/gio/gsimpleactiongroup.h \
- /usr/include/glib-2.0/gio/gactiongroup.h \
- /usr/include/glib-2.0/gio/gapplication.h \
- /usr/include/glib-2.0/gio/gapplicationcommandline.h \
- /usr/include/glib-2.0/gio/gasyncinitable.h \
- /usr/include/glib-2.0/gio/ginitable.h \
- /usr/include/glib-2.0/gio/gasyncresult.h \
- /usr/include/glib-2.0/gio/gbufferedinputstream.h \
- /usr/include/glib-2.0/gio/gfilterinputstream.h \
- /usr/include/glib-2.0/gio/ginputstream.h \
- /usr/include/glib-2.0/gio/gbufferedoutputstream.h \
- /usr/include/glib-2.0/gio/gfilteroutputstream.h \
- /usr/include/glib-2.0/gio/goutputstream.h \
- /usr/include/glib-2.0/gio/gcancellable.h \
- /usr/include/glib-2.0/gio/gcharsetconverter.h \
- /usr/include/glib-2.0/gio/gconverter.h \
- /usr/include/glib-2.0/gio/gcontenttype.h \
- /usr/include/glib-2.0/gio/gconverterinputstream.h \
- /usr/include/glib-2.0/gio/gconverteroutputstream.h \
- /usr/include/glib-2.0/gio/gcredentials.h \
- /usr/include/glib-2.0/gio/gdatainputstream.h \
- /usr/include/glib-2.0/gio/gdataoutputstream.h \
- /usr/include/glib-2.0/gio/gdbusaddress.h \
- /usr/include/glib-2.0/gio/gdbusauthobserver.h \
- /usr/include/glib-2.0/gio/gdbusconnection.h \
- /usr/include/glib-2.0/gio/gdbuserror.h \
- /usr/include/glib-2.0/gio/gdbusintrospection.h \
- /usr/include/glib-2.0/gio/gdbusmessage.h \
- /usr/include/glib-2.0/gio/gdbusmethodinvocation.h \
- /usr/include/glib-2.0/gio/gdbusnameowning.h \
- /usr/include/glib-2.0/gio/gdbusnamewatching.h \
- /usr/include/glib-2.0/gio/gdbusproxy.h \
- /usr/include/glib-2.0/gio/gdbusserver.h \
- /usr/include/glib-2.0/gio/gdbusutils.h \
- /usr/include/glib-2.0/gio/gdrive.h \
- /usr/include/glib-2.0/gio/gemblemedicon.h \
- /usr/include/glib-2.0/gio/gicon.h /usr/include/glib-2.0/gio/gemblem.h \
- /usr/include/glib-2.0/gio/gfileattribute.h \
- /usr/include/glib-2.0/gio/gfileenumerator.h \
- /usr/include/glib-2.0/gio/gfile.h /usr/include/glib-2.0/gio/gfileicon.h \
- /usr/include/glib-2.0/gio/gfileinfo.h \
- /usr/include/glib-2.0/gio/gfileinputstream.h \
- /usr/include/glib-2.0/gio/gfileiostream.h \
- /usr/include/glib-2.0/gio/giostream.h \
- /usr/include/glib-2.0/gio/gioerror.h \
- /usr/include/glib-2.0/gio/gfilemonitor.h \
- /usr/include/glib-2.0/gio/gfilenamecompleter.h \
- /usr/include/glib-2.0/gio/gfileoutputstream.h \
- /usr/include/glib-2.0/gio/ginetaddress.h \
- /usr/include/glib-2.0/gio/ginetsocketaddress.h \
- /usr/include/glib-2.0/gio/gsocketaddress.h \
- /usr/include/glib-2.0/gio/gioenumtypes.h \
- /usr/include/glib-2.0/gio/giomodule.h /usr/include/glib-2.0/gmodule.h \
- /usr/include/glib-2.0/gio/gioscheduler.h \
- /usr/include/glib-2.0/gio/gloadableicon.h \
- /usr/include/glib-2.0/gio/gmemoryinputstream.h \
- /usr/include/glib-2.0/gio/gmemoryoutputstream.h \
- /usr/include/glib-2.0/gio/gmount.h \
- /usr/include/glib-2.0/gio/gmountoperation.h \
- /usr/include/glib-2.0/gio/gnativevolumemonitor.h \
- /usr/include/glib-2.0/gio/gvolumemonitor.h \
- /usr/include/glib-2.0/gio/gnetworkaddress.h \
- /usr/include/glib-2.0/gio/gnetworkservice.h \
- /usr/include/glib-2.0/gio/gpermission.h \
- /usr/include/glib-2.0/gio/gpollableinputstream.h \
- /usr/include/glib-2.0/gio/gpollableoutputstream.h \
- /usr/include/glib-2.0/gio/gproxy.h \
- /usr/include/glib-2.0/gio/gproxyaddress.h \
- /usr/include/glib-2.0/gio/gproxyaddressenumerator.h \
- /usr/include/glib-2.0/gio/gsocketaddressenumerator.h \
- /usr/include/glib-2.0/gio/gproxyresolver.h \
- /usr/include/glib-2.0/gio/gresolver.h \
- /usr/include/glib-2.0/gio/gseekable.h \
- /usr/include/glib-2.0/gio/gsettings.h \
- /usr/include/glib-2.0/gio/gsimpleasyncresult.h \
- /usr/include/glib-2.0/gio/gsimplepermission.h \
- /usr/include/glib-2.0/gio/gsocketclient.h \
- /usr/include/glib-2.0/gio/gsocketconnectable.h \
- /usr/include/glib-2.0/gio/gsocketconnection.h \
- /usr/include/glib-2.0/gio/gsocket.h \
- /usr/include/glib-2.0/gio/gsocketcontrolmessage.h \
- /usr/include/glib-2.0/gio/gsocketlistener.h \
- /usr/include/glib-2.0/gio/gsocketservice.h \
- /usr/include/glib-2.0/gio/gsrvtarget.h \
- /usr/include/glib-2.0/gio/gtcpconnection.h \
- /usr/include/glib-2.0/gio/gtcpwrapperconnection.h \
- /usr/include/glib-2.0/gio/gthemedicon.h \
- /usr/include/glib-2.0/gio/gthreadedsocketservice.h \
- /usr/include/glib-2.0/gio/gtlsbackend.h \
- /usr/include/glib-2.0/gio/gtlscertificate.h \
- /usr/include/glib-2.0/gio/gtlsclientconnection.h \
- /usr/include/glib-2.0/gio/gtlsconnection.h \
- /usr/include/glib-2.0/gio/gtlsserverconnection.h \
- /usr/include/glib-2.0/gio/gvfs.h /usr/include/glib-2.0/gio/gvolume.h \
- /usr/include/glib-2.0/gio/gzlibcompressor.h \
- /usr/include/glib-2.0/gio/gzlibdecompressor.h \
- /usr/include/gtk-2.0/gdk/gdkscreen.h /usr/include/cairo/cairo.h \
- /usr/include/cairo/cairo-version.h /usr/include/cairo/cairo-features.h \
- /usr/include/cairo/cairo-deprecated.h \
- /usr/include/gtk-2.0/gdk/gdktypes.h /usr/include/pango-1.0/pango/pango.h \
- /usr/include/pango-1.0/pango/pango-attributes.h \
- /usr/include/pango-1.0/pango/pango-font.h \
- /usr/include/pango-1.0/pango/pango-coverage.h \
- /usr/include/pango-1.0/pango/pango-types.h \
- /usr/include/pango-1.0/pango/pango-gravity.h \
- /usr/include/pango-1.0/pango/pango-matrix.h \
- /usr/include/pango-1.0/pango/pango-script.h \
- /usr/include/pango-1.0/pango/pango-language.h \
- /usr/include/pango-1.0/pango/pango-bidi-type.h \
- /usr/include/pango-1.0/pango/pango-break.h \
- /usr/include/pango-1.0/pango/pango-item.h \
- /usr/include/pango-1.0/pango/pango-context.h \
- /usr/include/pango-1.0/pango/pango-fontmap.h \
- /usr/include/pango-1.0/pango/pango-fontset.h \
- /usr/include/pango-1.0/pango/pango-engine.h \
- /usr/include/pango-1.0/pango/pango-glyph.h \
- /usr/include/pango-1.0/pango/pango-enum-types.h \
- /usr/include/pango-1.0/pango/pango-features.h \
- /usr/include/pango-1.0/pango/pango-glyph-item.h \
- /usr/include/pango-1.0/pango/pango-layout.h \
- /usr/include/pango-1.0/pango/pango-tabs.h \
- /usr/include/pango-1.0/pango/pango-renderer.h \
- /usr/include/pango-1.0/pango/pango-utils.h \
- /usr/lib/gtk-2.0/include/gdkconfig.h \
- /usr/include/gtk-2.0/gdk/gdkdisplay.h \
- /usr/include/gtk-2.0/gdk/gdkevents.h /usr/include/gtk-2.0/gdk/gdkcolor.h \
- /usr/include/gtk-2.0/gdk/gdkdnd.h /usr/include/gtk-2.0/gdk/gdkinput.h \
- /usr/include/gtk-2.0/gdk/gdkcairo.h /usr/include/gtk-2.0/gdk/gdkpixbuf.h \
- /usr/include/gtk-2.0/gdk/gdkrgb.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-features.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-core.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-transform.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-animation.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-simple-anim.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-io.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-loader.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-enum-types.h \
- /usr/include/pango-1.0/pango/pangocairo.h \
- /usr/include/gtk-2.0/gdk/gdkcursor.h \
- /usr/include/gtk-2.0/gdk/gdkdisplaymanager.h \
- /usr/include/gtk-2.0/gdk/gdkdrawable.h /usr/include/gtk-2.0/gdk/gdkgc.h \
- /usr/include/gtk-2.0/gdk/gdkenumtypes.h \
- /usr/include/gtk-2.0/gdk/gdkfont.h /usr/include/gtk-2.0/gdk/gdkimage.h \
- /usr/include/gtk-2.0/gdk/gdkkeys.h /usr/include/gtk-2.0/gdk/gdkpango.h \
- /usr/include/gtk-2.0/gdk/gdkpixmap.h \
- /usr/include/gtk-2.0/gdk/gdkproperty.h \
- /usr/include/gtk-2.0/gdk/gdkregion.h \
- /usr/include/gtk-2.0/gdk/gdkselection.h \
- /usr/include/gtk-2.0/gdk/gdkspawn.h \
- /usr/include/gtk-2.0/gdk/gdktestutils.h \
- /usr/include/gtk-2.0/gdk/gdkwindow.h \
- /usr/include/gtk-2.0/gdk/gdkvisual.h \
- /usr/include/gtk-2.0/gtk/gtkaccelgroup.h \
- /usr/include/gtk-2.0/gtk/gtkenums.h /usr/include/gtk-2.0/gtk/gtkobject.h \
- /usr/include/gtk-2.0/gtk/gtktypeutils.h \
- /usr/include/gtk-2.0/gtk/gtktypebuiltins.h \
- /usr/include/gtk-2.0/gtk/gtkdebug.h \
- /usr/include/gtk-2.0/gtk/gtkadjustment.h \
- /usr/include/gtk-2.0/gtk/gtkstyle.h \
- /usr/include/gtk-2.0/gtk/gtksettings.h /usr/include/gtk-2.0/gtk/gtkrc.h \
- /usr/include/atk-1.0/atk/atk.h /usr/include/atk-1.0/atk/atkobject.h \
- /usr/include/atk-1.0/atk/atkstate.h \
- /usr/include/atk-1.0/atk/atkrelationtype.h \
- /usr/include/atk-1.0/atk/atkaction.h \
- /usr/include/atk-1.0/atk/atkcomponent.h \
- /usr/include/atk-1.0/atk/atkutil.h \
- /usr/include/atk-1.0/atk/atkdocument.h \
- /usr/include/atk-1.0/atk/atkeditabletext.h \
- /usr/include/atk-1.0/atk/atktext.h \
- /usr/include/atk-1.0/atk/atkgobjectaccessible.h \
- /usr/include/atk-1.0/atk/atkhyperlink.h \
- /usr/include/atk-1.0/atk/atkhyperlinkimpl.h \
- /usr/include/atk-1.0/atk/atkhypertext.h \
- /usr/include/atk-1.0/atk/atkimage.h \
- /usr/include/atk-1.0/atk/atknoopobject.h \
- /usr/include/atk-1.0/atk/atknoopobjectfactory.h \
- /usr/include/atk-1.0/atk/atkobjectfactory.h \
- /usr/include/atk-1.0/atk/atkplug.h \
- /usr/include/atk-1.0/atk/atkregistry.h \
- /usr/include/atk-1.0/atk/atkobjectfactory.h \
- /usr/include/atk-1.0/atk/atkrelation.h \
- /usr/include/atk-1.0/atk/atkrelationset.h \
- /usr/include/atk-1.0/atk/atkselection.h \
- /usr/include/atk-1.0/atk/atksocket.h \
- /usr/include/atk-1.0/atk/atkstateset.h \
- /usr/include/atk-1.0/atk/atkstreamablecontent.h \
- /usr/include/atk-1.0/atk/atktable.h /usr/include/atk-1.0/atk/atkmisc.h \
- /usr/include/atk-1.0/atk/atkvalue.h sysdep.h
-vlazyfixed.o: vlazyfixed.c vlazyfixed.h \
- /usr/include/gtk-2.0/gtk/gtkfixed.h \
- /usr/include/gtk-2.0/gtk/gtkcontainer.h \
- /usr/include/gtk-2.0/gtk/gtkwidget.h /usr/include/gtk-2.0/gdk/gdk.h \
- /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h \
- /usr/include/glib-2.0/gio/gio.h /usr/include/glib-2.0/gio/giotypes.h \
- /usr/include/glib-2.0/gio/gioenums.h /usr/include/glib-2.0/glib-object.h \
- /usr/include/glib-2.0/gobject/gbinding.h /usr/include/glib-2.0/glib.h \
- /usr/include/glib-2.0/glib/galloca.h /usr/include/glib-2.0/glib/gtypes.h \
- /usr/lib/glib-2.0/include/glibconfig.h \
- /usr/include/glib-2.0/glib/gmacros.h /usr/include/glib-2.0/glib/garray.h \
- /usr/include/glib-2.0/glib/gasyncqueue.h \
- /usr/include/glib-2.0/glib/gthread.h /usr/include/glib-2.0/glib/gerror.h \
- /usr/include/glib-2.0/glib/gquark.h /usr/include/glib-2.0/glib/gutils.h \
- /usr/include/glib-2.0/glib/gatomic.h \
- /usr/include/glib-2.0/glib/gbacktrace.h \
- /usr/include/glib-2.0/glib/gbase64.h \
- /usr/include/glib-2.0/glib/gbitlock.h \
- /usr/include/glib-2.0/glib/gbookmarkfile.h \
- /usr/include/glib-2.0/glib/gcache.h /usr/include/glib-2.0/glib/glist.h \
- /usr/include/glib-2.0/glib/gmem.h /usr/include/glib-2.0/glib/gslice.h \
- /usr/include/glib-2.0/glib/gchecksum.h \
- /usr/include/glib-2.0/glib/gcompletion.h \
- /usr/include/glib-2.0/glib/gconvert.h \
- /usr/include/glib-2.0/glib/gdataset.h /usr/include/glib-2.0/glib/gdate.h \
- /usr/include/glib-2.0/glib/gdatetime.h \
- /usr/include/glib-2.0/glib/gtimezone.h /usr/include/glib-2.0/glib/gdir.h \
- /usr/include/glib-2.0/glib/gfileutils.h \
- /usr/include/glib-2.0/glib/ghash.h /usr/include/glib-2.0/glib/ghook.h \
- /usr/include/glib-2.0/glib/ghostutils.h \
- /usr/include/glib-2.0/glib/giochannel.h \
- /usr/include/glib-2.0/glib/gmain.h /usr/include/glib-2.0/glib/gpoll.h \
- /usr/include/glib-2.0/glib/gslist.h /usr/include/glib-2.0/glib/gstring.h \
- /usr/include/glib-2.0/glib/gunicode.h \
- /usr/include/glib-2.0/glib/gkeyfile.h \
- /usr/include/glib-2.0/glib/gmappedfile.h \
- /usr/include/glib-2.0/glib/gmarkup.h \
- /usr/include/glib-2.0/glib/gmessages.h \
- /usr/include/glib-2.0/glib/gnode.h /usr/include/glib-2.0/glib/goption.h \
- /usr/include/glib-2.0/glib/gpattern.h \
- /usr/include/glib-2.0/glib/gprimes.h /usr/include/glib-2.0/glib/gqsort.h \
- /usr/include/glib-2.0/glib/gqueue.h /usr/include/glib-2.0/glib/grand.h \
- /usr/include/glib-2.0/glib/grel.h /usr/include/glib-2.0/glib/gregex.h \
- /usr/include/glib-2.0/glib/gscanner.h \
- /usr/include/glib-2.0/glib/gsequence.h \
- /usr/include/glib-2.0/glib/gshell.h /usr/include/glib-2.0/glib/gspawn.h \
- /usr/include/glib-2.0/glib/gstrfuncs.h \
- /usr/include/glib-2.0/glib/gtestutils.h \
- /usr/include/glib-2.0/glib/gthreadpool.h \
- /usr/include/glib-2.0/glib/gtimer.h /usr/include/glib-2.0/glib/gtree.h \
- /usr/include/glib-2.0/glib/gurifuncs.h \
- /usr/include/glib-2.0/glib/gvarianttype.h \
- /usr/include/glib-2.0/glib/gvariant.h \
- /usr/include/glib-2.0/gobject/gobject.h \
- /usr/include/glib-2.0/gobject/gtype.h \
- /usr/include/glib-2.0/gobject/gvalue.h \
- /usr/include/glib-2.0/gobject/gparam.h \
- /usr/include/glib-2.0/gobject/gclosure.h \
- /usr/include/glib-2.0/gobject/gsignal.h \
- /usr/include/glib-2.0/gobject/gmarshal.h \
- /usr/include/glib-2.0/gobject/gboxed.h \
- /usr/include/glib-2.0/gobject/genums.h \
- /usr/include/glib-2.0/gobject/gparamspecs.h \
- /usr/include/glib-2.0/gobject/gsourceclosure.h \
- /usr/include/glib-2.0/gobject/gtypemodule.h \
- /usr/include/glib-2.0/gobject/gtypeplugin.h \
- /usr/include/glib-2.0/gobject/gvaluearray.h \
- /usr/include/glib-2.0/gobject/gvaluetypes.h \
- /usr/include/glib-2.0/gio/gappinfo.h /usr/include/glib-2.0/gio/gaction.h \
- /usr/include/glib-2.0/gio/gsimpleaction.h \
- /usr/include/glib-2.0/gio/gactiongroup.h \
- /usr/include/glib-2.0/gio/gsimpleactiongroup.h \
- /usr/include/glib-2.0/gio/gactiongroup.h \
- /usr/include/glib-2.0/gio/gapplication.h \
- /usr/include/glib-2.0/gio/gapplicationcommandline.h \
- /usr/include/glib-2.0/gio/gasyncinitable.h \
- /usr/include/glib-2.0/gio/ginitable.h \
- /usr/include/glib-2.0/gio/gasyncresult.h \
- /usr/include/glib-2.0/gio/gbufferedinputstream.h \
- /usr/include/glib-2.0/gio/gfilterinputstream.h \
- /usr/include/glib-2.0/gio/ginputstream.h \
- /usr/include/glib-2.0/gio/gbufferedoutputstream.h \
- /usr/include/glib-2.0/gio/gfilteroutputstream.h \
- /usr/include/glib-2.0/gio/goutputstream.h \
- /usr/include/glib-2.0/gio/gcancellable.h \
- /usr/include/glib-2.0/gio/gcharsetconverter.h \
- /usr/include/glib-2.0/gio/gconverter.h \
- /usr/include/glib-2.0/gio/gcontenttype.h \
- /usr/include/glib-2.0/gio/gconverterinputstream.h \
- /usr/include/glib-2.0/gio/gconverteroutputstream.h \
- /usr/include/glib-2.0/gio/gcredentials.h \
- /usr/include/glib-2.0/gio/gdatainputstream.h \
- /usr/include/glib-2.0/gio/gdataoutputstream.h \
- /usr/include/glib-2.0/gio/gdbusaddress.h \
- /usr/include/glib-2.0/gio/gdbusauthobserver.h \
- /usr/include/glib-2.0/gio/gdbusconnection.h \
- /usr/include/glib-2.0/gio/gdbuserror.h \
- /usr/include/glib-2.0/gio/gdbusintrospection.h \
- /usr/include/glib-2.0/gio/gdbusmessage.h \
- /usr/include/glib-2.0/gio/gdbusmethodinvocation.h \
- /usr/include/glib-2.0/gio/gdbusnameowning.h \
- /usr/include/glib-2.0/gio/gdbusnamewatching.h \
- /usr/include/glib-2.0/gio/gdbusproxy.h \
- /usr/include/glib-2.0/gio/gdbusserver.h \
- /usr/include/glib-2.0/gio/gdbusutils.h \
- /usr/include/glib-2.0/gio/gdrive.h \
- /usr/include/glib-2.0/gio/gemblemedicon.h \
- /usr/include/glib-2.0/gio/gicon.h /usr/include/glib-2.0/gio/gemblem.h \
- /usr/include/glib-2.0/gio/gfileattribute.h \
- /usr/include/glib-2.0/gio/gfileenumerator.h \
- /usr/include/glib-2.0/gio/gfile.h /usr/include/glib-2.0/gio/gfileicon.h \
- /usr/include/glib-2.0/gio/gfileinfo.h \
- /usr/include/glib-2.0/gio/gfileinputstream.h \
- /usr/include/glib-2.0/gio/gfileiostream.h \
- /usr/include/glib-2.0/gio/giostream.h \
- /usr/include/glib-2.0/gio/gioerror.h \
- /usr/include/glib-2.0/gio/gfilemonitor.h \
- /usr/include/glib-2.0/gio/gfilenamecompleter.h \
- /usr/include/glib-2.0/gio/gfileoutputstream.h \
- /usr/include/glib-2.0/gio/ginetaddress.h \
- /usr/include/glib-2.0/gio/ginetsocketaddress.h \
- /usr/include/glib-2.0/gio/gsocketaddress.h \
- /usr/include/glib-2.0/gio/gioenumtypes.h \
- /usr/include/glib-2.0/gio/giomodule.h /usr/include/glib-2.0/gmodule.h \
- /usr/include/glib-2.0/gio/gioscheduler.h \
- /usr/include/glib-2.0/gio/gloadableicon.h \
- /usr/include/glib-2.0/gio/gmemoryinputstream.h \
- /usr/include/glib-2.0/gio/gmemoryoutputstream.h \
- /usr/include/glib-2.0/gio/gmount.h \
- /usr/include/glib-2.0/gio/gmountoperation.h \
- /usr/include/glib-2.0/gio/gnativevolumemonitor.h \
- /usr/include/glib-2.0/gio/gvolumemonitor.h \
- /usr/include/glib-2.0/gio/gnetworkaddress.h \
- /usr/include/glib-2.0/gio/gnetworkservice.h \
- /usr/include/glib-2.0/gio/gpermission.h \
- /usr/include/glib-2.0/gio/gpollableinputstream.h \
- /usr/include/glib-2.0/gio/gpollableoutputstream.h \
- /usr/include/glib-2.0/gio/gproxy.h \
- /usr/include/glib-2.0/gio/gproxyaddress.h \
- /usr/include/glib-2.0/gio/gproxyaddressenumerator.h \
- /usr/include/glib-2.0/gio/gsocketaddressenumerator.h \
- /usr/include/glib-2.0/gio/gproxyresolver.h \
- /usr/include/glib-2.0/gio/gresolver.h \
- /usr/include/glib-2.0/gio/gseekable.h \
- /usr/include/glib-2.0/gio/gsettings.h \
- /usr/include/glib-2.0/gio/gsimpleasyncresult.h \
- /usr/include/glib-2.0/gio/gsimplepermission.h \
- /usr/include/glib-2.0/gio/gsocketclient.h \
- /usr/include/glib-2.0/gio/gsocketconnectable.h \
- /usr/include/glib-2.0/gio/gsocketconnection.h \
- /usr/include/glib-2.0/gio/gsocket.h \
- /usr/include/glib-2.0/gio/gsocketcontrolmessage.h \
- /usr/include/glib-2.0/gio/gsocketlistener.h \
- /usr/include/glib-2.0/gio/gsocketservice.h \
- /usr/include/glib-2.0/gio/gsrvtarget.h \
- /usr/include/glib-2.0/gio/gtcpconnection.h \
- /usr/include/glib-2.0/gio/gtcpwrapperconnection.h \
- /usr/include/glib-2.0/gio/gthemedicon.h \
- /usr/include/glib-2.0/gio/gthreadedsocketservice.h \
- /usr/include/glib-2.0/gio/gtlsbackend.h \
- /usr/include/glib-2.0/gio/gtlscertificate.h \
- /usr/include/glib-2.0/gio/gtlsclientconnection.h \
- /usr/include/glib-2.0/gio/gtlsconnection.h \
- /usr/include/glib-2.0/gio/gtlsserverconnection.h \
- /usr/include/glib-2.0/gio/gvfs.h /usr/include/glib-2.0/gio/gvolume.h \
- /usr/include/glib-2.0/gio/gzlibcompressor.h \
- /usr/include/glib-2.0/gio/gzlibdecompressor.h \
- /usr/include/gtk-2.0/gdk/gdkscreen.h /usr/include/cairo/cairo.h \
- /usr/include/cairo/cairo-version.h /usr/include/cairo/cairo-features.h \
- /usr/include/cairo/cairo-deprecated.h \
- /usr/include/gtk-2.0/gdk/gdktypes.h /usr/include/pango-1.0/pango/pango.h \
- /usr/include/pango-1.0/pango/pango-attributes.h \
- /usr/include/pango-1.0/pango/pango-font.h \
- /usr/include/pango-1.0/pango/pango-coverage.h \
- /usr/include/pango-1.0/pango/pango-types.h \
- /usr/include/pango-1.0/pango/pango-gravity.h \
- /usr/include/pango-1.0/pango/pango-matrix.h \
- /usr/include/pango-1.0/pango/pango-script.h \
- /usr/include/pango-1.0/pango/pango-language.h \
- /usr/include/pango-1.0/pango/pango-bidi-type.h \
- /usr/include/pango-1.0/pango/pango-break.h \
- /usr/include/pango-1.0/pango/pango-item.h \
- /usr/include/pango-1.0/pango/pango-context.h \
- /usr/include/pango-1.0/pango/pango-fontmap.h \
- /usr/include/pango-1.0/pango/pango-fontset.h \
- /usr/include/pango-1.0/pango/pango-engine.h \
- /usr/include/pango-1.0/pango/pango-glyph.h \
- /usr/include/pango-1.0/pango/pango-enum-types.h \
- /usr/include/pango-1.0/pango/pango-features.h \
- /usr/include/pango-1.0/pango/pango-glyph-item.h \
- /usr/include/pango-1.0/pango/pango-layout.h \
- /usr/include/pango-1.0/pango/pango-tabs.h \
- /usr/include/pango-1.0/pango/pango-renderer.h \
- /usr/include/pango-1.0/pango/pango-utils.h \
- /usr/lib/gtk-2.0/include/gdkconfig.h \
- /usr/include/gtk-2.0/gdk/gdkdisplay.h \
- /usr/include/gtk-2.0/gdk/gdkevents.h /usr/include/gtk-2.0/gdk/gdkcolor.h \
- /usr/include/gtk-2.0/gdk/gdkdnd.h /usr/include/gtk-2.0/gdk/gdkinput.h \
- /usr/include/gtk-2.0/gdk/gdkcairo.h /usr/include/gtk-2.0/gdk/gdkpixbuf.h \
- /usr/include/gtk-2.0/gdk/gdkrgb.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-features.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-core.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-transform.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-animation.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-simple-anim.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-io.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-loader.h \
- /usr/include/gdk-pixbuf-2.0/gdk-pixbuf/gdk-pixbuf-enum-types.h \
- /usr/include/pango-1.0/pango/pangocairo.h \
- /usr/include/gtk-2.0/gdk/gdkcursor.h \
- /usr/include/gtk-2.0/gdk/gdkdisplaymanager.h \
- /usr/include/gtk-2.0/gdk/gdkdrawable.h /usr/include/gtk-2.0/gdk/gdkgc.h \
- /usr/include/gtk-2.0/gdk/gdkenumtypes.h \
- /usr/include/gtk-2.0/gdk/gdkfont.h /usr/include/gtk-2.0/gdk/gdkimage.h \
- /usr/include/gtk-2.0/gdk/gdkkeys.h /usr/include/gtk-2.0/gdk/gdkpango.h \
- /usr/include/gtk-2.0/gdk/gdkpixmap.h \
- /usr/include/gtk-2.0/gdk/gdkproperty.h \
- /usr/include/gtk-2.0/gdk/gdkregion.h \
- /usr/include/gtk-2.0/gdk/gdkselection.h \
- /usr/include/gtk-2.0/gdk/gdkspawn.h \
- /usr/include/gtk-2.0/gdk/gdktestutils.h \
- /usr/include/gtk-2.0/gdk/gdkwindow.h \
- /usr/include/gtk-2.0/gdk/gdkvisual.h \
- /usr/include/gtk-2.0/gtk/gtkaccelgroup.h \
- /usr/include/gtk-2.0/gtk/gtkenums.h /usr/include/gtk-2.0/gtk/gtkobject.h \
- /usr/include/gtk-2.0/gtk/gtktypeutils.h \
- /usr/include/gtk-2.0/gtk/gtktypebuiltins.h \
- /usr/include/gtk-2.0/gtk/gtkdebug.h \
- /usr/include/gtk-2.0/gtk/gtkadjustment.h \
- /usr/include/gtk-2.0/gtk/gtkstyle.h \
- /usr/include/gtk-2.0/gtk/gtksettings.h /usr/include/gtk-2.0/gtk/gtkrc.h \
- /usr/include/atk-1.0/atk/atk.h /usr/include/atk-1.0/atk/atkobject.h \
- /usr/include/atk-1.0/atk/atkstate.h \
- /usr/include/atk-1.0/atk/atkrelationtype.h \
- /usr/include/atk-1.0/atk/atkaction.h \
- /usr/include/atk-1.0/atk/atkcomponent.h \
- /usr/include/atk-1.0/atk/atkutil.h \
- /usr/include/atk-1.0/atk/atkdocument.h \
- /usr/include/atk-1.0/atk/atkeditabletext.h \
- /usr/include/atk-1.0/atk/atktext.h \
- /usr/include/atk-1.0/atk/atkgobjectaccessible.h \
- /usr/include/atk-1.0/atk/atkhyperlink.h \
- /usr/include/atk-1.0/atk/atkhyperlinkimpl.h \
- /usr/include/atk-1.0/atk/atkhypertext.h \
- /usr/include/atk-1.0/atk/atkimage.h \
- /usr/include/atk-1.0/atk/atknoopobject.h \
- /usr/include/atk-1.0/atk/atknoopobjectfactory.h \
- /usr/include/atk-1.0/atk/atkobjectfactory.h \
- /usr/include/atk-1.0/atk/atkplug.h \
- /usr/include/atk-1.0/atk/atkregistry.h \
- /usr/include/atk-1.0/atk/atkobjectfactory.h \
- /usr/include/atk-1.0/atk/atkrelation.h \
- /usr/include/atk-1.0/atk/atkrelationset.h \
- /usr/include/atk-1.0/atk/atkselection.h \
- /usr/include/atk-1.0/atk/atksocket.h \
- /usr/include/atk-1.0/atk/atkstateset.h \
- /usr/include/atk-1.0/atk/atkstreamablecontent.h \
- /usr/include/atk-1.0/atk/atktable.h /usr/include/atk-1.0/atk/atkmisc.h \
- /usr/include/atk-1.0/atk/atkvalue.h sysdep.h
+gui.o: gui.c gui.h lazyfixed.h sysdep.h vlazyfixed.h client.h game.h \
+ tiles.h tiles-enums.h player.h player-enums.h protocol.h cmsg_union.h \
+ pmsg_union.h protocol-enums.h game-enums.h version.h gtkrc.h
+gui-dial.o: gui-dial.c gui.h lazyfixed.h sysdep.h vlazyfixed.h client.h \
+ game.h tiles.h tiles-enums.h player.h player-enums.h protocol.h \
+ cmsg_union.h pmsg_union.h protocol-enums.h game-enums.h version.h
+lazyfixed.o: lazyfixed.c lazyfixed.h sysdep.h
+vlazyfixed.o: vlazyfixed.c vlazyfixed.h sysdep.h
 client.o: client.c sysdep.h client.h game.h tiles.h tiles-enums.h \
  player.h player-enums.h protocol.h cmsg_union.h pmsg_union.h \
  protocol-enums.h game-enums.h
--- /dev/null
+++ b/cmsg_size.c
@@ -0,0 +1,1332 @@
+static int cmsg_size[] = {
+-sizeof(CMsgErrorMsg),
+-sizeof(CMsgInfoTilesMsg),
+-sizeof(CMsgStateSavedMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+-sizeof(CMsgConnectReplyMsg),
+sizeof(CMsgReconnectMsg),
+-sizeof(CMsgAuthReqdMsg),
+-sizeof(CMsgRedirectMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+-sizeof(CMsgPlayerMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(CMsgNewRoundMsg),
+sizeof(CMsgGameMsg),
+sizeof(CMsgNewHandMsg),
+0,
+0,
+sizeof(CMsgPlayerDeclaresSpecialMsg),
+sizeof(CMsgStartPlayMsg),
+-sizeof(CMsgStopPlayMsg),
+-sizeof(CMsgPauseMsg),
+sizeof(CMsgPlayerReadyMsg),
+0,
+sizeof(CMsgPlayerDrawsMsg),
+sizeof(CMsgPlayerDrawsLooseMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(CMsgPlayerDiscardsMsg),
+-sizeof(CMsgClaimDeniedMsg),
+sizeof(CMsgPlayerDoesntClaimMsg),
+0,
+0,
+sizeof(CMsgDangerousDiscardMsg),
+0,
+0,
+0,
+0,
+sizeof(CMsgPlayerClaimsPungMsg),
+sizeof(CMsgPlayerPungsMsg),
+sizeof(CMsgPlayerFormsClosedPungMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(CMsgPlayerClaimsKongMsg),
+sizeof(CMsgPlayerKongsMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(CMsgPlayerDeclaresClosedKongMsg),
+sizeof(CMsgPlayerAddsToPungMsg),
+0,
+0,
+0,
+sizeof(CMsgPlayerRobsKongMsg),
+0,
+sizeof(CMsgCanMahJongMsg),
+0,
+0,
+sizeof(CMsgPlayerClaimsChowMsg),
+sizeof(CMsgPlayerChowsMsg),
+sizeof(CMsgPlayerFormsClosedChowMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+-sizeof(CMsgWashOutMsg),
+sizeof(CMsgPlayerClaimsMahJongMsg),
+sizeof(CMsgPlayerMahJongsMsg),
+sizeof(CMsgPlayerPairsMsg),
+sizeof(CMsgPlayerFormsClosedPairMsg),
+0,
+-sizeof(CMsgPlayerShowsTilesMsg),
+-sizeof(CMsgPlayerSpecialSetMsg),
+-sizeof(CMsgPlayerFormsClosedSpecialSetMsg),
+0,
+0,
+-sizeof(CMsgPlayerOptionSetMsg),
+0,
+0,
+0,
+0,
+-sizeof(CMsgHandScoreMsg),
+0,
+0,
+0,
+0,
+-sizeof(CMsgSettlementMsg),
+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,
+sizeof(CMsgGameOverMsg),
+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,
+sizeof(CMsgGameOptionMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(CMsgChangeManagerMsg),
+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,
+-sizeof(CMsgMessageMsg),
+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,
+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,
+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,
+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,
+-sizeof(CMsgWallMsg),
+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,
+-sizeof(CMsgCommentMsg),
+sizeof(CMsgSwapTileMsg),
+};
+
+int cmsg_size_of(ControllerMsgType t) { return cmsg_size[t]; }
+
+CMsgMsg *cmsg_deepcopy(CMsgMsg *m) {
+  CMsgMsg *n;
+  int size;
+  char *mc,*nc;
+
+  size = cmsg_size_of(m->type);
+  if ( size < 0 ) size *= -1;
+  n = (CMsgMsg *)malloc(size);
+  if ( ! n ) return n;
+
+  memcpy((void *)n,(const void *)m,size);
+  switch ( m->type ) {
+  case CMsgWashOut:
+    mc = ((CMsgWashOutMsg *)m)->reason;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgWashOutMsg *)n)->reason = nc;
+    break;
+  case CMsgSettlement:
+    mc = ((CMsgSettlementMsg *)m)->explanation;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgSettlementMsg *)n)->explanation = nc;
+    break;
+  case CMsgConnectReply:
+    mc = ((CMsgConnectReplyMsg *)m)->reason;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgConnectReplyMsg *)n)->reason = nc;
+    break;
+  case CMsgPlayerOptionSet:
+    mc = ((CMsgPlayerOptionSetMsg *)m)->text;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgPlayerOptionSetMsg *)n)->text = nc;
+    break;
+  case CMsgError:
+    mc = ((CMsgErrorMsg *)m)->error;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgErrorMsg *)n)->error = nc;
+    break;
+  case CMsgInfoTiles:
+    mc = ((CMsgInfoTilesMsg *)m)->tileinfo;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgInfoTilesMsg *)n)->tileinfo = nc;
+    break;
+  case CMsgRedirect:
+    mc = ((CMsgRedirectMsg *)m)->dest;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgRedirectMsg *)n)->dest = nc;
+    break;
+  case CMsgPlayerFormsClosedSpecialSet:
+    mc = ((CMsgPlayerFormsClosedSpecialSetMsg *)m)->tiles;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgPlayerFormsClosedSpecialSetMsg *)n)->tiles = nc;
+    break;
+  case CMsgMessage:
+    mc = ((CMsgMessageMsg *)m)->text;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgMessageMsg *)n)->text = nc;
+    break;
+  case CMsgAuthReqd:
+    mc = ((CMsgAuthReqdMsg *)m)->authdata;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgAuthReqdMsg *)n)->authdata = nc;
+    break;
+  case CMsgPause:
+    mc = ((CMsgPauseMsg *)m)->reason;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgPauseMsg *)n)->reason = nc;
+    break;
+  case CMsgStateSaved:
+    mc = ((CMsgStateSavedMsg *)m)->filename;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgStateSavedMsg *)n)->filename = nc;
+    break;
+  case CMsgWall:
+    mc = ((CMsgWallMsg *)m)->wall;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgWallMsg *)n)->wall = nc;
+    break;
+  case CMsgPlayerSpecialSet:
+    mc = ((CMsgPlayerSpecialSetMsg *)m)->tiles;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgPlayerSpecialSetMsg *)n)->tiles = nc;
+    break;
+  case CMsgPlayerShowsTiles:
+    mc = ((CMsgPlayerShowsTilesMsg *)m)->tiles;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgPlayerShowsTilesMsg *)n)->tiles = nc;
+    break;
+  case CMsgComment:
+    mc = ((CMsgCommentMsg *)m)->comment;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgCommentMsg *)n)->comment = nc;
+    break;
+  case CMsgPlayer:
+    mc = ((CMsgPlayerMsg *)m)->name;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgPlayerMsg *)n)->name = nc;
+    break;
+  case CMsgStopPlay:
+    mc = ((CMsgStopPlayMsg *)m)->reason;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgStopPlayMsg *)n)->reason = nc;
+    break;
+  case CMsgClaimDenied:
+    mc = ((CMsgClaimDeniedMsg *)m)->reason;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgClaimDeniedMsg *)n)->reason = nc;
+    break;
+  case CMsgHandScore:
+    mc = ((CMsgHandScoreMsg *)m)->explanation;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((CMsgHandScoreMsg *)n)->explanation = nc;
+    break;
+  default:
+      ;
+  }
+  return n;
+}
+
+void cmsg_deepfree(CMsgMsg *m) {
+  switch ( m->type ) {
+  case CMsgWashOut:
+    if ( ((CMsgWashOutMsg *)m)->reason )
+      free((void *)((CMsgWashOutMsg *)m)->reason);
+    break;
+  case CMsgSettlement:
+    if ( ((CMsgSettlementMsg *)m)->explanation )
+      free((void *)((CMsgSettlementMsg *)m)->explanation);
+    break;
+  case CMsgConnectReply:
+    if ( ((CMsgConnectReplyMsg *)m)->reason )
+      free((void *)((CMsgConnectReplyMsg *)m)->reason);
+    break;
+  case CMsgPlayerOptionSet:
+    if ( ((CMsgPlayerOptionSetMsg *)m)->text )
+      free((void *)((CMsgPlayerOptionSetMsg *)m)->text);
+    break;
+  case CMsgError:
+    if ( ((CMsgErrorMsg *)m)->error )
+      free((void *)((CMsgErrorMsg *)m)->error);
+    break;
+  case CMsgInfoTiles:
+    if ( ((CMsgInfoTilesMsg *)m)->tileinfo )
+      free((void *)((CMsgInfoTilesMsg *)m)->tileinfo);
+    break;
+  case CMsgRedirect:
+    if ( ((CMsgRedirectMsg *)m)->dest )
+      free((void *)((CMsgRedirectMsg *)m)->dest);
+    break;
+  case CMsgPlayerFormsClosedSpecialSet:
+    if ( ((CMsgPlayerFormsClosedSpecialSetMsg *)m)->tiles )
+      free((void *)((CMsgPlayerFormsClosedSpecialSetMsg *)m)->tiles);
+    break;
+  case CMsgMessage:
+    if ( ((CMsgMessageMsg *)m)->text )
+      free((void *)((CMsgMessageMsg *)m)->text);
+    break;
+  case CMsgAuthReqd:
+    if ( ((CMsgAuthReqdMsg *)m)->authdata )
+      free((void *)((CMsgAuthReqdMsg *)m)->authdata);
+    break;
+  case CMsgPause:
+    if ( ((CMsgPauseMsg *)m)->reason )
+      free((void *)((CMsgPauseMsg *)m)->reason);
+    break;
+  case CMsgStateSaved:
+    if ( ((CMsgStateSavedMsg *)m)->filename )
+      free((void *)((CMsgStateSavedMsg *)m)->filename);
+    break;
+  case CMsgWall:
+    if ( ((CMsgWallMsg *)m)->wall )
+      free((void *)((CMsgWallMsg *)m)->wall);
+    break;
+  case CMsgPlayerSpecialSet:
+    if ( ((CMsgPlayerSpecialSetMsg *)m)->tiles )
+      free((void *)((CMsgPlayerSpecialSetMsg *)m)->tiles);
+    break;
+  case CMsgPlayerShowsTiles:
+    if ( ((CMsgPlayerShowsTilesMsg *)m)->tiles )
+      free((void *)((CMsgPlayerShowsTilesMsg *)m)->tiles);
+    break;
+  case CMsgComment:
+    if ( ((CMsgCommentMsg *)m)->comment )
+      free((void *)((CMsgCommentMsg *)m)->comment);
+    break;
+  case CMsgPlayer:
+    if ( ((CMsgPlayerMsg *)m)->name )
+      free((void *)((CMsgPlayerMsg *)m)->name);
+    break;
+  case CMsgStopPlay:
+    if ( ((CMsgStopPlayMsg *)m)->reason )
+      free((void *)((CMsgStopPlayMsg *)m)->reason);
+    break;
+  case CMsgClaimDenied:
+    if ( ((CMsgClaimDeniedMsg *)m)->reason )
+      free((void *)((CMsgClaimDeniedMsg *)m)->reason);
+    break;
+  case CMsgHandScore:
+    if ( ((CMsgHandScoreMsg *)m)->explanation )
+      free((void *)((CMsgHandScoreMsg *)m)->explanation);
+    break;
+  default:
+      ;
+  }
+  free((void *)m);
+}
+
--- /dev/null
+++ b/cmsg_union.h
@@ -0,0 +1,57 @@
+typedef union _CMsgUnion {
+  /* Note that this type field relies on the fact that all
+     messages have type as their first field */
+ControllerMsgType type;
+CMsgErrorMsg error;
+CMsgInfoTilesMsg infotiles;
+CMsgStateSavedMsg statesaved;
+CMsgConnectReplyMsg connectreply;
+CMsgReconnectMsg reconnect;
+CMsgAuthReqdMsg authreqd;
+CMsgRedirectMsg redirect;
+CMsgPlayerMsg player;
+CMsgNewRoundMsg newround;
+CMsgGameMsg game;
+CMsgNewHandMsg newhand;
+CMsgPlayerDeclaresSpecialMsg playerdeclaresspecial;
+CMsgStartPlayMsg startplay;
+CMsgStopPlayMsg stopplay;
+CMsgPauseMsg pause;
+CMsgPlayerReadyMsg playerready;
+CMsgPlayerDrawsMsg playerdraws;
+CMsgPlayerDrawsLooseMsg playerdrawsloose;
+CMsgPlayerDiscardsMsg playerdiscards;
+CMsgClaimDeniedMsg claimdenied;
+CMsgPlayerDoesntClaimMsg playerdoesntclaim;
+CMsgDangerousDiscardMsg dangerousdiscard;
+CMsgPlayerClaimsPungMsg playerclaimspung;
+CMsgPlayerPungsMsg playerpungs;
+CMsgPlayerFormsClosedPungMsg playerformsclosedpung;
+CMsgPlayerClaimsKongMsg playerclaimskong;
+CMsgPlayerKongsMsg playerkongs;
+CMsgPlayerDeclaresClosedKongMsg playerdeclaresclosedkong;
+CMsgPlayerAddsToPungMsg playeraddstopung;
+CMsgPlayerRobsKongMsg playerrobskong;
+CMsgCanMahJongMsg canmahjong;
+CMsgPlayerClaimsChowMsg playerclaimschow;
+CMsgPlayerChowsMsg playerchows;
+CMsgPlayerFormsClosedChowMsg playerformsclosedchow;
+CMsgWashOutMsg washout;
+CMsgPlayerClaimsMahJongMsg playerclaimsmahjong;
+CMsgPlayerMahJongsMsg playermahjongs;
+CMsgPlayerPairsMsg playerpairs;
+CMsgPlayerFormsClosedPairMsg playerformsclosedpair;
+CMsgPlayerShowsTilesMsg playershowstiles;
+CMsgPlayerSpecialSetMsg playerspecialset;
+CMsgPlayerFormsClosedSpecialSetMsg playerformsclosedspecialset;
+CMsgPlayerOptionSetMsg playeroptionset;
+CMsgHandScoreMsg handscore;
+CMsgSettlementMsg settlement;
+CMsgGameOverMsg gameover;
+CMsgGameOptionMsg gameoption;
+CMsgChangeManagerMsg changemanager;
+CMsgMessageMsg message;
+CMsgWallMsg wall;
+CMsgCommentMsg comment;
+CMsgSwapTileMsg swaptile;
+} CMsgUnion;
--- /dev/null
+++ b/dec_cmsg.c
@@ -0,0 +1,1176 @@
+  if ( strcmp(type,"Error") == 0 ) {
+    CMsgErrorMsg *m;
+
+    m = (CMsgErrorMsg *)malloc(sizeof(CMsgErrorMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgError;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->seqno = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->error = (char *)0;
+    else {
+      m->error = (char *)malloc(strlen(s)+1);
+      if ( ! m->error ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->error,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"StateSaved") == 0 ) {
+    CMsgStateSavedMsg *m;
+
+    m = (CMsgStateSavedMsg *)malloc(sizeof(CMsgStateSavedMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgStateSaved;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->filename = (char *)0;
+    else {
+      m->filename = (char *)malloc(strlen(s)+1);
+      if ( ! m->filename ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->filename,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"InfoTiles") == 0 ) {
+    CMsgInfoTilesMsg *m;
+
+    m = (CMsgInfoTilesMsg *)malloc(sizeof(CMsgInfoTilesMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgInfoTiles;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->tileinfo = (char *)0;
+    else {
+      m->tileinfo = (char *)malloc(strlen(s)+1);
+      if ( ! m->tileinfo ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->tileinfo,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"ConnectReply") == 0 ) {
+    CMsgConnectReplyMsg *m;
+
+    m = (CMsgConnectReplyMsg *)malloc(sizeof(CMsgConnectReplyMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgConnectReply;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->pvers = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->reason = (char *)0;
+    else {
+      m->reason = (char *)malloc(strlen(s)+1);
+      if ( ! m->reason ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->reason,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"AuthReqd") == 0 ) {
+    CMsgAuthReqdMsg *m;
+
+    m = (CMsgAuthReqdMsg *)malloc(sizeof(CMsgAuthReqdMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgAuthReqd;
+
+    if ( sscanf(s,"%16s%n",little_string,&n) == 0 ) { warn("protocol error\n");  return (CMsgMsg *)0; }
+    strmcpy(m->authtype,little_string,16);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->authdata = (char *)0;
+    else {
+      m->authdata = (char *)malloc(strlen(s)+1);
+      if ( ! m->authdata ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->authdata,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"Redirect") == 0 ) {
+    CMsgRedirectMsg *m;
+
+    m = (CMsgRedirectMsg *)malloc(sizeof(CMsgRedirectMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgRedirect;
+
+    if ( strlen(s) == 0 ) m->dest = (char *)0;
+    else {
+      m->dest = (char *)malloc(strlen(s)+1);
+      if ( ! m->dest ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->dest,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"Reconnect") == 0 ) {
+    CMsgReconnectMsg *m;
+
+    m = (CMsgReconnectMsg *)malloc(sizeof(CMsgReconnectMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgReconnect;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"Player") == 0 ) {
+    CMsgPlayerMsg *m;
+
+    m = (CMsgPlayerMsg *)malloc(sizeof(CMsgPlayerMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayer;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->name = (char *)0;
+    else {
+      m->name = (char *)malloc(strlen(s)+1);
+      if ( ! m->name ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->name,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"Game") == 0 ) {
+    CMsgGameMsg *m;
+
+    m = (CMsgGameMsg *)malloc(sizeof(CMsgGameMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgGame;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->east = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->south = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->west = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->north = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%c%n",&a_char,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->round = letterwind(a_char);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->hands_as_east = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->firsteast = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->east_score = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->south_score = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->west_score = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->north_score = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->protversion = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->manager = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"NewRound") == 0 ) {
+    CMsgNewRoundMsg *m;
+
+    m = (CMsgNewRoundMsg *)malloc(sizeof(CMsgNewRoundMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgNewRound;
+
+    if ( sscanf(s,"%c%n",&a_char,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->round = letterwind(a_char);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"NewHand") == 0 ) {
+    CMsgNewHandMsg *m;
+
+    m = (CMsgNewHandMsg *)malloc(sizeof(CMsgNewHandMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgNewHand;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->east = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->start_wall = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->start_stack = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerDraws") == 0 ) {
+    CMsgPlayerDrawsMsg *m;
+
+    m = (CMsgPlayerDrawsMsg *)malloc(sizeof(CMsgPlayerDrawsMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerDraws;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerDrawsLoose") == 0 ) {
+    CMsgPlayerDrawsLooseMsg *m;
+
+    m = (CMsgPlayerDrawsLooseMsg *)malloc(sizeof(CMsgPlayerDrawsLooseMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerDrawsLoose;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerDeclaresSpecial") == 0 ) {
+    CMsgPlayerDeclaresSpecialMsg *m;
+
+    m = (CMsgPlayerDeclaresSpecialMsg *)malloc(sizeof(CMsgPlayerDeclaresSpecialMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerDeclaresSpecial;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"StartPlay") == 0 ) {
+    CMsgStartPlayMsg *m;
+
+    m = (CMsgStartPlayMsg *)malloc(sizeof(CMsgStartPlayMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgStartPlay;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"StopPlay") == 0 ) {
+    CMsgStopPlayMsg *m;
+
+    m = (CMsgStopPlayMsg *)malloc(sizeof(CMsgStopPlayMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgStopPlay;
+
+    if ( strlen(s) == 0 ) m->reason = (char *)0;
+    else {
+      m->reason = (char *)malloc(strlen(s)+1);
+      if ( ! m->reason ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->reason,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"Pause") == 0 ) {
+    CMsgPauseMsg *m;
+
+    m = (CMsgPauseMsg *)malloc(sizeof(CMsgPauseMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPause;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->exempt = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->requestor = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->reason = (char *)0;
+    else {
+      m->reason = (char *)malloc(strlen(s)+1);
+      if ( ! m->reason ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->reason,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerReady") == 0 ) {
+    CMsgPlayerReadyMsg *m;
+
+    m = (CMsgPlayerReadyMsg *)malloc(sizeof(CMsgPlayerReadyMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerReady;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerDiscards") == 0 ) {
+    CMsgPlayerDiscardsMsg *m;
+
+    m = (CMsgPlayerDiscardsMsg *)malloc(sizeof(CMsgPlayerDiscardsMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerDiscards;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    if ( an_int < 0 || an_int > 1 ) { warn("protocol error\n") ; return (CMsgMsg *)0; }
+    m->calling = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerDoesntClaim") == 0 ) {
+    CMsgPlayerDoesntClaimMsg *m;
+
+    m = (CMsgPlayerDoesntClaimMsg *)malloc(sizeof(CMsgPlayerDoesntClaimMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerDoesntClaim;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    if ( an_int < 0 || an_int > 1 ) { warn("protocol error\n") ; return (CMsgMsg *)0; }
+    m->timeout = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"DangerousDiscard") == 0 ) {
+    CMsgDangerousDiscardMsg *m;
+
+    m = (CMsgDangerousDiscardMsg *)malloc(sizeof(CMsgDangerousDiscardMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgDangerousDiscard;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    if ( an_int < 0 || an_int > 1 ) { warn("protocol error\n") ; return (CMsgMsg *)0; }
+    m->nochoice = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerClaimsPung") == 0 ) {
+    CMsgPlayerClaimsPungMsg *m;
+
+    m = (CMsgPlayerClaimsPungMsg *)malloc(sizeof(CMsgPlayerClaimsPungMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerClaimsPung;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"ClaimDenied") == 0 ) {
+    CMsgClaimDeniedMsg *m;
+
+    m = (CMsgClaimDeniedMsg *)malloc(sizeof(CMsgClaimDeniedMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgClaimDenied;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->reason = (char *)0;
+    else {
+      m->reason = (char *)malloc(strlen(s)+1);
+      if ( ! m->reason ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->reason,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerPungs") == 0 ) {
+    CMsgPlayerPungsMsg *m;
+
+    m = (CMsgPlayerPungsMsg *)malloc(sizeof(CMsgPlayerPungsMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerPungs;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerFormsClosedPung") == 0 ) {
+    CMsgPlayerFormsClosedPungMsg *m;
+
+    m = (CMsgPlayerFormsClosedPungMsg *)malloc(sizeof(CMsgPlayerFormsClosedPungMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerFormsClosedPung;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerClaimsKong") == 0 ) {
+    CMsgPlayerClaimsKongMsg *m;
+
+    m = (CMsgPlayerClaimsKongMsg *)malloc(sizeof(CMsgPlayerClaimsKongMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerClaimsKong;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerKongs") == 0 ) {
+    CMsgPlayerKongsMsg *m;
+
+    m = (CMsgPlayerKongsMsg *)malloc(sizeof(CMsgPlayerKongsMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerKongs;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerDeclaresClosedKong") == 0 ) {
+    CMsgPlayerDeclaresClosedKongMsg *m;
+
+    m = (CMsgPlayerDeclaresClosedKongMsg *)malloc(sizeof(CMsgPlayerDeclaresClosedKongMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerDeclaresClosedKong;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerAddsToPung") == 0 ) {
+    CMsgPlayerAddsToPungMsg *m;
+
+    m = (CMsgPlayerAddsToPungMsg *)malloc(sizeof(CMsgPlayerAddsToPungMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerAddsToPung;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerRobsKong") == 0 ) {
+    CMsgPlayerRobsKongMsg *m;
+
+    m = (CMsgPlayerRobsKongMsg *)malloc(sizeof(CMsgPlayerRobsKongMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerRobsKong;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"CanMahJong") == 0 ) {
+    CMsgCanMahJongMsg *m;
+
+    m = (CMsgCanMahJongMsg *)malloc(sizeof(CMsgCanMahJongMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgCanMahJong;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    if ( an_int < 0 || an_int > 1 ) { warn("protocol error\n") ; return (CMsgMsg *)0; }
+    m->answer = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerClaimsChow") == 0 ) {
+    CMsgPlayerClaimsChowMsg *m;
+
+    m = (CMsgPlayerClaimsChowMsg *)malloc(sizeof(CMsgPlayerClaimsChowMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerClaimsChow;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%31s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->cpos = string_cpos(little_string);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerChows") == 0 ) {
+    CMsgPlayerChowsMsg *m;
+
+    m = (CMsgPlayerChowsMsg *)malloc(sizeof(CMsgPlayerChowsMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerChows;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%31s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->cpos = string_cpos(little_string);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerFormsClosedChow") == 0 ) {
+    CMsgPlayerFormsClosedChowMsg *m;
+
+    m = (CMsgPlayerFormsClosedChowMsg *)malloc(sizeof(CMsgPlayerFormsClosedChowMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerFormsClosedChow;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"WashOut") == 0 ) {
+    CMsgWashOutMsg *m;
+
+    m = (CMsgWashOutMsg *)malloc(sizeof(CMsgWashOutMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgWashOut;
+
+    if ( strlen(s) == 0 ) m->reason = (char *)0;
+    else {
+      m->reason = (char *)malloc(strlen(s)+1);
+      if ( ! m->reason ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->reason,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerClaimsMahJong") == 0 ) {
+    CMsgPlayerClaimsMahJongMsg *m;
+
+    m = (CMsgPlayerClaimsMahJongMsg *)malloc(sizeof(CMsgPlayerClaimsMahJongMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerClaimsMahJong;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerMahJongs") == 0 ) {
+    CMsgPlayerMahJongsMsg *m;
+
+    m = (CMsgPlayerMahJongsMsg *)malloc(sizeof(CMsgPlayerMahJongsMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerMahJongs;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerPairs") == 0 ) {
+    CMsgPlayerPairsMsg *m;
+
+    m = (CMsgPlayerPairsMsg *)malloc(sizeof(CMsgPlayerPairsMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerPairs;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerFormsClosedPair") == 0 ) {
+    CMsgPlayerFormsClosedPairMsg *m;
+
+    m = (CMsgPlayerFormsClosedPairMsg *)malloc(sizeof(CMsgPlayerFormsClosedPairMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerFormsClosedPair;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerSpecialSet") == 0 ) {
+    CMsgPlayerSpecialSetMsg *m;
+
+    m = (CMsgPlayerSpecialSetMsg *)malloc(sizeof(CMsgPlayerSpecialSetMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerSpecialSet;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->tiles = (char *)0;
+    else {
+      m->tiles = (char *)malloc(strlen(s)+1);
+      if ( ! m->tiles ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->tiles,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerFormsClosedSpecialSet") == 0 ) {
+    CMsgPlayerFormsClosedSpecialSetMsg *m;
+
+    m = (CMsgPlayerFormsClosedSpecialSetMsg *)malloc(sizeof(CMsgPlayerFormsClosedSpecialSetMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerFormsClosedSpecialSet;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->tiles = (char *)0;
+    else {
+      m->tiles = (char *)malloc(strlen(s)+1);
+      if ( ! m->tiles ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->tiles,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerShowsTiles") == 0 ) {
+    CMsgPlayerShowsTilesMsg *m;
+
+    m = (CMsgPlayerShowsTilesMsg *)malloc(sizeof(CMsgPlayerShowsTilesMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerShowsTiles;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->tiles = (char *)0;
+    else {
+      m->tiles = (char *)malloc(strlen(s)+1);
+      if ( ! m->tiles ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->tiles,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"HandScore") == 0 ) {
+    CMsgHandScoreMsg *m;
+
+    m = (CMsgHandScoreMsg *)malloc(sizeof(CMsgHandScoreMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgHandScore;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->score = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->explanation = (char *)0;
+    else {
+      m->explanation = (char *)malloc(strlen(s)+1);
+      if ( ! m->explanation ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->explanation,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"Settlement") == 0 ) {
+    CMsgSettlementMsg *m;
+
+    m = (CMsgSettlementMsg *)malloc(sizeof(CMsgSettlementMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgSettlement;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->east = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->south = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->west = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->north = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->explanation = (char *)0;
+    else {
+      m->explanation = (char *)malloc(strlen(s)+1);
+      if ( ! m->explanation ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->explanation,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"PlayerOptionSet") == 0 ) {
+    CMsgPlayerOptionSetMsg *m;
+
+    m = (CMsgPlayerOptionSetMsg *)malloc(sizeof(CMsgPlayerOptionSetMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgPlayerOptionSet;
+
+    if ( sscanf(s,"%31s%n",little_string,&n) ==0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->option = player_scan_PlayerOption(little_string);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    if ( an_int < 0 || an_int > 1 ) { warn("protocol error\n") ; return (CMsgMsg *)0; }
+    m->ack = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->value = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->text = (char *)0;
+    else {
+      m->text = (char *)malloc(strlen(s)+1);
+      if ( ! m->text ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->text,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"GameOver") == 0 ) {
+    CMsgGameOverMsg *m;
+
+    m = (CMsgGameOverMsg *)malloc(sizeof(CMsgGameOverMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgGameOver;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"GameOption") == 0 ) {
+    CMsgGameOptionMsg *m;
+
+    m = (CMsgGameOptionMsg *)malloc(sizeof(CMsgGameOptionMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgGameOption;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( (goe = protocol_scan_GameOptionEntry(s)) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    memcpy(&m->optentry,goe,sizeof(GameOptionEntry));
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"ChangeManager") == 0 ) {
+    CMsgChangeManagerMsg *m;
+
+    m = (CMsgChangeManagerMsg *)malloc(sizeof(CMsgChangeManagerMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgChangeManager;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->manager = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"Message") == 0 ) {
+    CMsgMessageMsg *m;
+
+    m = (CMsgMessageMsg *)malloc(sizeof(CMsgMessageMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgMessage;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->sender = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->addressee = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->text = (char *)0;
+    else {
+      m->text = (char *)malloc(strlen(s)+1);
+      if ( ! m->text ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->text,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"Wall") == 0 ) {
+    CMsgWallMsg *m;
+
+    m = (CMsgWallMsg *)malloc(sizeof(CMsgWallMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgWall;
+
+    if ( strlen(s) == 0 ) m->wall = (char *)0;
+    else {
+      m->wall = (char *)malloc(strlen(s)+1);
+      if ( ! m->wall ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->wall,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"Comment") == 0  || strcmp(type,"#") == 0 ) {
+    CMsgCommentMsg *m;
+
+    m = (CMsgCommentMsg *)malloc(sizeof(CMsgCommentMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgComment;
+
+    if ( strlen(s) == 0 ) m->comment = (char *)0;
+    else {
+      m->comment = (char *)malloc(strlen(s)+1);
+      if ( ! m->comment ) { warn("malloc failed\n"); return (CMsgMsg *)0; }
+      strcpy(m->comment,s+(s[0] == '\\'));
+    }
+    return (CMsgMsg *) m;
+  }
+  if ( strcmp(type,"SwapTile") == 0 ) {
+    CMsgSwapTileMsg *m;
+
+    m = (CMsgSwapTileMsg *)malloc(sizeof(CMsgSwapTileMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (CMsgMsg *)0; }
+
+    m->type = CMsgSwapTile;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->oldtile = tile_decode(little_string);
+    if ( m->oldtile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    m->newtile = tile_decode(little_string);
+    if ( m->newtile == ErrorTile ) { warn("protocol error\n"); return (CMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (CMsgMsg *) m;
+  }
--- /dev/null
+++ b/dec_pmsg.c
@@ -0,0 +1,557 @@
+  if ( strcmp(type,"SaveState") == 0 ) {
+    PMsgSaveStateMsg *m;
+
+    m = (PMsgSaveStateMsg *)malloc(sizeof(PMsgSaveStateMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgSaveState;
+
+    if ( strlen(s) == 0 ) m->filename = (char *)0;
+    else {
+      m->filename = (char *)malloc(strlen(s)+1);
+      if ( ! m->filename ) { warn("malloc failed\n"); return (PMsgMsg *)0; }
+      strcpy(m->filename,s+(s[0] == '\\'));
+    }
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"LoadState") == 0 ) {
+    PMsgLoadStateMsg *m;
+
+    m = (PMsgLoadStateMsg *)malloc(sizeof(PMsgLoadStateMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgLoadState;
+
+    if ( strlen(s) == 0 ) m->filename = (char *)0;
+    else {
+      m->filename = (char *)malloc(strlen(s)+1);
+      if ( ! m->filename ) { warn("malloc failed\n"); return (PMsgMsg *)0; }
+      strcpy(m->filename,s+(s[0] == '\\'));
+    }
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"Connect") == 0 ) {
+    PMsgConnectMsg *m;
+
+    m = (PMsgConnectMsg *)malloc(sizeof(PMsgConnectMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgConnect;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->pvers = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->last_id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->name = (char *)0;
+    else {
+      m->name = (char *)malloc(strlen(s)+1);
+      if ( ! m->name ) { warn("malloc failed\n"); return (PMsgMsg *)0; }
+      strcpy(m->name,s+(s[0] == '\\'));
+    }
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"AuthInfo") == 0 ) {
+    PMsgAuthInfoMsg *m;
+
+    m = (PMsgAuthInfoMsg *)malloc(sizeof(PMsgAuthInfoMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgAuthInfo;
+
+    if ( sscanf(s,"%16s%n",little_string,&n) == 0 ) { warn("protocol error\n");  return (PMsgMsg *)0; }
+    strmcpy(m->authtype,little_string,16);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->authdata = (char *)0;
+    else {
+      m->authdata = (char *)malloc(strlen(s)+1);
+      if ( ! m->authdata ) { warn("malloc failed\n"); return (PMsgMsg *)0; }
+      strcpy(m->authdata,s+(s[0] == '\\'));
+    }
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"NewAuthInfo") == 0 ) {
+    PMsgNewAuthInfoMsg *m;
+
+    m = (PMsgNewAuthInfoMsg *)malloc(sizeof(PMsgNewAuthInfoMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgNewAuthInfo;
+
+    if ( sscanf(s,"%16s%n",little_string,&n) == 0 ) { warn("protocol error\n");  return (PMsgMsg *)0; }
+    strmcpy(m->authtype,little_string,16);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->authdata = (char *)0;
+    else {
+      m->authdata = (char *)malloc(strlen(s)+1);
+      if ( ! m->authdata ) { warn("malloc failed\n"); return (PMsgMsg *)0; }
+      strcpy(m->authdata,s+(s[0] == '\\'));
+    }
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"RequestReconnect") == 0 ) {
+    PMsgRequestReconnectMsg *m;
+
+    m = (PMsgRequestReconnectMsg *)malloc(sizeof(PMsgRequestReconnectMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgRequestReconnect;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"Disconnect") == 0 ) {
+    PMsgDisconnectMsg *m;
+
+    m = (PMsgDisconnectMsg *)malloc(sizeof(PMsgDisconnectMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgDisconnect;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"DeclareSpecial") == 0  || strcmp(type,"ds") == 0 ) {
+    PMsgDeclareSpecialMsg *m;
+
+    m = (PMsgDeclareSpecialMsg *)malloc(sizeof(PMsgDeclareSpecialMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgDeclareSpecial;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"RequestPause") == 0 ) {
+    PMsgRequestPauseMsg *m;
+
+    m = (PMsgRequestPauseMsg *)malloc(sizeof(PMsgRequestPauseMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgRequestPause;
+
+    if ( strlen(s) == 0 ) m->reason = (char *)0;
+    else {
+      m->reason = (char *)malloc(strlen(s)+1);
+      if ( ! m->reason ) { warn("malloc failed\n"); return (PMsgMsg *)0; }
+      strcpy(m->reason,s+(s[0] == '\\'));
+    }
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"Ready") == 0 ) {
+    PMsgReadyMsg *m;
+
+    m = (PMsgReadyMsg *)malloc(sizeof(PMsgReadyMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgReady;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"Discard") == 0  || strcmp(type,"d") == 0 ) {
+    PMsgDiscardMsg *m;
+
+    m = (PMsgDiscardMsg *)malloc(sizeof(PMsgDiscardMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgDiscard;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    if ( an_int < 0 || an_int > 1 ) { warn("protocol error\n") ; return (PMsgMsg *)0; }
+    m->calling = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"NoClaim") == 0  || strcmp(type,"n") == 0 ) {
+    PMsgNoClaimMsg *m;
+
+    m = (PMsgNoClaimMsg *)malloc(sizeof(PMsgNoClaimMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgNoClaim;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"Pung") == 0  || strcmp(type,"p") == 0 ) {
+    PMsgPungMsg *m;
+
+    m = (PMsgPungMsg *)malloc(sizeof(PMsgPungMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgPung;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"FormClosedPung") == 0 ) {
+    PMsgFormClosedPungMsg *m;
+
+    m = (PMsgFormClosedPungMsg *)malloc(sizeof(PMsgFormClosedPungMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgFormClosedPung;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"Kong") == 0  || strcmp(type,"k") == 0 ) {
+    PMsgKongMsg *m;
+
+    m = (PMsgKongMsg *)malloc(sizeof(PMsgKongMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgKong;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"DeclareClosedKong") == 0  || strcmp(type,"ck") == 0 ) {
+    PMsgDeclareClosedKongMsg *m;
+
+    m = (PMsgDeclareClosedKongMsg *)malloc(sizeof(PMsgDeclareClosedKongMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgDeclareClosedKong;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"AddToPung") == 0 ) {
+    PMsgAddToPungMsg *m;
+
+    m = (PMsgAddToPungMsg *)malloc(sizeof(PMsgAddToPungMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgAddToPung;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"QueryMahJong") == 0 ) {
+    PMsgQueryMahJongMsg *m;
+
+    m = (PMsgQueryMahJongMsg *)malloc(sizeof(PMsgQueryMahJongMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgQueryMahJong;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"Chow") == 0  || strcmp(type,"c") == 0 ) {
+    PMsgChowMsg *m;
+
+    m = (PMsgChowMsg *)malloc(sizeof(PMsgChowMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgChow;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%31s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->cpos = string_cpos(little_string);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"FormClosedChow") == 0 ) {
+    PMsgFormClosedChowMsg *m;
+
+    m = (PMsgFormClosedChowMsg *)malloc(sizeof(PMsgFormClosedChowMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgFormClosedChow;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"DeclareWashOut") == 0 ) {
+    PMsgDeclareWashOutMsg *m;
+
+    m = (PMsgDeclareWashOutMsg *)malloc(sizeof(PMsgDeclareWashOutMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgDeclareWashOut;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"MahJong") == 0 ) {
+    PMsgMahJongMsg *m;
+
+    m = (PMsgMahJongMsg *)malloc(sizeof(PMsgMahJongMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgMahJong;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->discard = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"Pair") == 0 ) {
+    PMsgPairMsg *m;
+
+    m = (PMsgPairMsg *)malloc(sizeof(PMsgPairMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgPair;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"FormClosedPair") == 0 ) {
+    PMsgFormClosedPairMsg *m;
+
+    m = (PMsgFormClosedPairMsg *)malloc(sizeof(PMsgFormClosedPairMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgFormClosedPair;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->tile = tile_decode(little_string);
+    if ( m->tile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"SpecialSet") == 0 ) {
+    PMsgSpecialSetMsg *m;
+
+    m = (PMsgSpecialSetMsg *)malloc(sizeof(PMsgSpecialSetMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgSpecialSet;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"FormClosedSpecialSet") == 0 ) {
+    PMsgFormClosedSpecialSetMsg *m;
+
+    m = (PMsgFormClosedSpecialSetMsg *)malloc(sizeof(PMsgFormClosedSpecialSetMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgFormClosedSpecialSet;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"ShowTiles") == 0 ) {
+    PMsgShowTilesMsg *m;
+
+    m = (PMsgShowTilesMsg *)malloc(sizeof(PMsgShowTilesMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgShowTiles;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"SetPlayerOption") == 0 ) {
+    PMsgSetPlayerOptionMsg *m;
+
+    m = (PMsgSetPlayerOptionMsg *)malloc(sizeof(PMsgSetPlayerOptionMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgSetPlayerOption;
+
+    if ( sscanf(s,"%31s%n",little_string,&n) ==0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->option = player_scan_PlayerOption(little_string);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    if ( an_int < 0 || an_int > 1 ) { warn("protocol error\n") ; return (PMsgMsg *)0; }
+    m->ack = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->value = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->text = (char *)0;
+    else {
+      m->text = (char *)malloc(strlen(s)+1);
+      if ( ! m->text ) { warn("malloc failed\n"); return (PMsgMsg *)0; }
+      strcpy(m->text,s+(s[0] == '\\'));
+    }
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"SetGameOption") == 0 ) {
+    PMsgSetGameOptionMsg *m;
+
+    m = (PMsgSetGameOptionMsg *)malloc(sizeof(PMsgSetGameOptionMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgSetGameOption;
+
+    if ( sscanf(s,"%16s%n",little_string,&n) == 0 ) { warn("protocol error\n");  return (PMsgMsg *)0; }
+    strmcpy(m->optname,little_string,16);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->optvalue = (char *)0;
+    else {
+      m->optvalue = (char *)malloc(strlen(s)+1);
+      if ( ! m->optvalue ) { warn("malloc failed\n"); return (PMsgMsg *)0; }
+      strcpy(m->optvalue,s+(s[0] == '\\'));
+    }
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"QueryGameOption") == 0 ) {
+    PMsgQueryGameOptionMsg *m;
+
+    m = (PMsgQueryGameOptionMsg *)malloc(sizeof(PMsgQueryGameOptionMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgQueryGameOption;
+
+    if ( sscanf(s,"%16s%n",little_string,&n) == 0 ) { warn("protocol error\n");  return (PMsgMsg *)0; }
+    strmcpy(m->optname,little_string,16);
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"ListGameOptions") == 0 ) {
+    PMsgListGameOptionsMsg *m;
+
+    m = (PMsgListGameOptionsMsg *)malloc(sizeof(PMsgListGameOptionsMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgListGameOptions;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    if ( an_int < 0 || an_int > 1 ) { warn("protocol error\n") ; return (PMsgMsg *)0; }
+    m->include_disabled = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"ChangeManager") == 0 ) {
+    PMsgChangeManagerMsg *m;
+
+    m = (PMsgChangeManagerMsg *)malloc(sizeof(PMsgChangeManagerMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgChangeManager;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->manager = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"SendMessage") == 0 ) {
+    PMsgSendMessageMsg *m;
+
+    m = (PMsgSendMessageMsg *)malloc(sizeof(PMsgSendMessageMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgSendMessage;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->addressee = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( strlen(s) == 0 ) m->text = (char *)0;
+    else {
+      m->text = (char *)malloc(strlen(s)+1);
+      if ( ! m->text ) { warn("malloc failed\n"); return (PMsgMsg *)0; }
+      strcpy(m->text,s+(s[0] == '\\'));
+    }
+    return (PMsgMsg *) m;
+  }
+  if ( strcmp(type,"SwapTile") == 0  || strcmp(type,"st") == 0 ) {
+    PMsgSwapTileMsg *m;
+
+    m = (PMsgSwapTileMsg *)malloc(sizeof(PMsgSwapTileMsg));
+    if ( ! m ) { warn("malloc failed\n") ; return (PMsgMsg *)0; }
+
+    m->type = PMsgSwapTile;
+
+    if ( sscanf(s,"%d%n",&an_int,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->id = an_int;
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->oldtile = tile_decode(little_string);
+    if ( m->oldtile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    if ( sscanf(s,"%2s%n",little_string,&n) == 0 ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    m->newtile = tile_decode(little_string);
+    if ( m->newtile == ErrorTile ) { warn("protocol error\n"); return (PMsgMsg *)0; }
+    s += n;
+    while ( isspace(*s) ) s++;
+
+    return (PMsgMsg *) m;
+  }
--- /dev/null
+++ b/enc_cmsg.c
@@ -0,0 +1,790 @@
+  case CMsgError: 
+    { CMsgErrorMsg *m UNUSED = (CMsgErrorMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Error %d %s%s\r\n", m->seqno,(m->error && (m->error[0] == ' ' || m->error[0] == '\\')) ? "\\" : "", m->error ? m->error : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgStateSaved: 
+    { CMsgStateSavedMsg *m UNUSED = (CMsgStateSavedMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"StateSaved %d %s%s\r\n", m->id,(m->filename && (m->filename[0] == ' ' || m->filename[0] == '\\')) ? "\\" : "", m->filename ? m->filename : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgInfoTiles: 
+    { CMsgInfoTilesMsg *m UNUSED = (CMsgInfoTilesMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"InfoTiles %d %s%s\r\n", m->id,(m->tileinfo && (m->tileinfo[0] == ' ' || m->tileinfo[0] == '\\')) ? "\\" : "", m->tileinfo ? m->tileinfo : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgConnectReply: 
+    { CMsgConnectReplyMsg *m UNUSED = (CMsgConnectReplyMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"ConnectReply %d %d %s%s\r\n", m->pvers, m->id,(m->reason && (m->reason[0] == ' ' || m->reason[0] == '\\')) ? "\\" : "", m->reason ? m->reason : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgAuthReqd: 
+    { CMsgAuthReqdMsg *m UNUSED = (CMsgAuthReqdMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"AuthReqd %s %s%s\r\n", m->authtype ,(m->authdata && (m->authdata[0] == ' ' || m->authdata[0] == '\\')) ? "\\" : "", m->authdata ? m->authdata : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgRedirect: 
+    { CMsgRedirectMsg *m UNUSED = (CMsgRedirectMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Redirect %s%s\r\n",(m->dest && (m->dest[0] == ' ' || m->dest[0] == '\\')) ? "\\" : "", m->dest ? m->dest : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgReconnect: 
+    { CMsgReconnectMsg *m UNUSED = (CMsgReconnectMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Reconnect\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayer: 
+    { CMsgPlayerMsg *m UNUSED = (CMsgPlayerMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Player %d %s%s\r\n", m->id,(m->name && (m->name[0] == ' ' || m->name[0] == '\\')) ? "\\" : "", m->name ? m->name : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgGame: 
+    { CMsgGameMsg *m UNUSED = (CMsgGameMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Game %d %d %d %d %c %d %d %d %d %d %d %d %d\r\n", m->east, m->south, m->west, m->north, windletter(m->round), m->hands_as_east, m->firsteast, m->east_score, m->south_score, m->west_score, m->north_score, m->protversion, m->manager);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgNewRound: 
+    { CMsgNewRoundMsg *m UNUSED = (CMsgNewRoundMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"NewRound %c\r\n", windletter(m->round));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgNewHand: 
+    { CMsgNewHandMsg *m UNUSED = (CMsgNewHandMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"NewHand %d %d %d\r\n", m->east, m->start_wall, m->start_stack);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerDraws: 
+    { CMsgPlayerDrawsMsg *m UNUSED = (CMsgPlayerDrawsMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerDraws %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerDrawsLoose: 
+    { CMsgPlayerDrawsLooseMsg *m UNUSED = (CMsgPlayerDrawsLooseMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerDrawsLoose %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerDeclaresSpecial: 
+    { CMsgPlayerDeclaresSpecialMsg *m UNUSED = (CMsgPlayerDeclaresSpecialMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerDeclaresSpecial %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgStartPlay: 
+    { CMsgStartPlayMsg *m UNUSED = (CMsgStartPlayMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"StartPlay %d\r\n", m->id);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgStopPlay: 
+    { CMsgStopPlayMsg *m UNUSED = (CMsgStopPlayMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"StopPlay %s%s\r\n",(m->reason && (m->reason[0] == ' ' || m->reason[0] == '\\')) ? "\\" : "", m->reason ? m->reason : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPause: 
+    { CMsgPauseMsg *m UNUSED = (CMsgPauseMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Pause %d %d %s%s\r\n", m->exempt, m->requestor,(m->reason && (m->reason[0] == ' ' || m->reason[0] == '\\')) ? "\\" : "", m->reason ? m->reason : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerReady: 
+    { CMsgPlayerReadyMsg *m UNUSED = (CMsgPlayerReadyMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerReady %d\r\n", m->id);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerDiscards: 
+    { CMsgPlayerDiscardsMsg *m UNUSED = (CMsgPlayerDiscardsMsg *) msg;
+    badfield = 0;
+    if ( m->calling < 0 || m->calling > 1 ) { warn("bad boolean in message, assuming TRUE"); badfield = 1 ; };
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerDiscards %d %s %d %d\r\n", m->id, tile_code(m->tile), m->discard, (badfield ? 1 : m->calling));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerDoesntClaim: 
+    { CMsgPlayerDoesntClaimMsg *m UNUSED = (CMsgPlayerDoesntClaimMsg *) msg;
+    badfield = 0;
+    if ( m->timeout < 0 || m->timeout > 1 ) { warn("bad boolean in message, assuming TRUE"); badfield = 1 ; };
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerDoesntClaim %d %d %d\r\n", m->id, m->discard, (badfield ? 1 : m->timeout));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgDangerousDiscard: 
+    { CMsgDangerousDiscardMsg *m UNUSED = (CMsgDangerousDiscardMsg *) msg;
+    badfield = 0;
+    if ( m->nochoice < 0 || m->nochoice > 1 ) { warn("bad boolean in message, assuming TRUE"); badfield = 1 ; };
+      while (1) {
+        int size = snprintf(buf,buf_size,"DangerousDiscard %d %d %d\r\n", m->id, m->discard, (badfield ? 1 : m->nochoice));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerClaimsPung: 
+    { CMsgPlayerClaimsPungMsg *m UNUSED = (CMsgPlayerClaimsPungMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerClaimsPung %d %d\r\n", m->id, m->discard);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgClaimDenied: 
+    { CMsgClaimDeniedMsg *m UNUSED = (CMsgClaimDeniedMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"ClaimDenied %d %s%s\r\n", m->id,(m->reason && (m->reason[0] == ' ' || m->reason[0] == '\\')) ? "\\" : "", m->reason ? m->reason : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerPungs: 
+    { CMsgPlayerPungsMsg *m UNUSED = (CMsgPlayerPungsMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerPungs %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerFormsClosedPung: 
+    { CMsgPlayerFormsClosedPungMsg *m UNUSED = (CMsgPlayerFormsClosedPungMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerFormsClosedPung %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerClaimsKong: 
+    { CMsgPlayerClaimsKongMsg *m UNUSED = (CMsgPlayerClaimsKongMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerClaimsKong %d %d\r\n", m->id, m->discard);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerKongs: 
+    { CMsgPlayerKongsMsg *m UNUSED = (CMsgPlayerKongsMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerKongs %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerDeclaresClosedKong: 
+    { CMsgPlayerDeclaresClosedKongMsg *m UNUSED = (CMsgPlayerDeclaresClosedKongMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerDeclaresClosedKong %d %s %d\r\n", m->id, tile_code(m->tile), m->discard);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerAddsToPung: 
+    { CMsgPlayerAddsToPungMsg *m UNUSED = (CMsgPlayerAddsToPungMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerAddsToPung %d %s %d\r\n", m->id, tile_code(m->tile), m->discard);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerRobsKong: 
+    { CMsgPlayerRobsKongMsg *m UNUSED = (CMsgPlayerRobsKongMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerRobsKong %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgCanMahJong: 
+    { CMsgCanMahJongMsg *m UNUSED = (CMsgCanMahJongMsg *) msg;
+    badfield = 0;
+    if ( m->answer < 0 || m->answer > 1 ) { warn("bad boolean in message, assuming TRUE"); badfield = 1 ; };
+      while (1) {
+        int size = snprintf(buf,buf_size,"CanMahJong %s %d\r\n", tile_code(m->tile), (badfield ? 1 : m->answer));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerClaimsChow: 
+    { CMsgPlayerClaimsChowMsg *m UNUSED = (CMsgPlayerClaimsChowMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerClaimsChow %d %d %s\r\n", m->id, m->discard, cpos_string(m->cpos));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerChows: 
+    { CMsgPlayerChowsMsg *m UNUSED = (CMsgPlayerChowsMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerChows %d %s %s\r\n", m->id, tile_code(m->tile), cpos_string(m->cpos));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerFormsClosedChow: 
+    { CMsgPlayerFormsClosedChowMsg *m UNUSED = (CMsgPlayerFormsClosedChowMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerFormsClosedChow %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgWashOut: 
+    { CMsgWashOutMsg *m UNUSED = (CMsgWashOutMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"WashOut %s%s\r\n",(m->reason && (m->reason[0] == ' ' || m->reason[0] == '\\')) ? "\\" : "", m->reason ? m->reason : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerClaimsMahJong: 
+    { CMsgPlayerClaimsMahJongMsg *m UNUSED = (CMsgPlayerClaimsMahJongMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerClaimsMahJong %d %d\r\n", m->id, m->discard);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerMahJongs: 
+    { CMsgPlayerMahJongsMsg *m UNUSED = (CMsgPlayerMahJongsMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerMahJongs %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerPairs: 
+    { CMsgPlayerPairsMsg *m UNUSED = (CMsgPlayerPairsMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerPairs %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerFormsClosedPair: 
+    { CMsgPlayerFormsClosedPairMsg *m UNUSED = (CMsgPlayerFormsClosedPairMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerFormsClosedPair %d %s\r\n", m->id, tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerSpecialSet: 
+    { CMsgPlayerSpecialSetMsg *m UNUSED = (CMsgPlayerSpecialSetMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerSpecialSet %d %s %s%s\r\n", m->id, tile_code(m->tile),(m->tiles && (m->tiles[0] == ' ' || m->tiles[0] == '\\')) ? "\\" : "", m->tiles ? m->tiles : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerFormsClosedSpecialSet: 
+    { CMsgPlayerFormsClosedSpecialSetMsg *m UNUSED = (CMsgPlayerFormsClosedSpecialSetMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerFormsClosedSpecialSet %d %s%s\r\n", m->id,(m->tiles && (m->tiles[0] == ' ' || m->tiles[0] == '\\')) ? "\\" : "", m->tiles ? m->tiles : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerShowsTiles: 
+    { CMsgPlayerShowsTilesMsg *m UNUSED = (CMsgPlayerShowsTilesMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerShowsTiles %d %s%s\r\n", m->id,(m->tiles && (m->tiles[0] == ' ' || m->tiles[0] == '\\')) ? "\\" : "", m->tiles ? m->tiles : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgHandScore: 
+    { CMsgHandScoreMsg *m UNUSED = (CMsgHandScoreMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"HandScore %d %d %s%s\r\n", m->id, m->score,(m->explanation && (m->explanation[0] == ' ' || m->explanation[0] == '\\')) ? "\\" : "", m->explanation ? m->explanation : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgSettlement: 
+    { CMsgSettlementMsg *m UNUSED = (CMsgSettlementMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Settlement %d %d %d %d %s%s\r\n", m->east, m->south, m->west, m->north,(m->explanation && (m->explanation[0] == ' ' || m->explanation[0] == '\\')) ? "\\" : "", m->explanation ? m->explanation : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgPlayerOptionSet: 
+    { CMsgPlayerOptionSetMsg *m UNUSED = (CMsgPlayerOptionSetMsg *) msg;
+    badfield = 0;
+    if ( m->ack < 0 || m->ack > 1 ) { warn("bad boolean in message, assuming TRUE"); badfield = 1 ; };
+      while (1) {
+        int size = snprintf(buf,buf_size,"PlayerOptionSet %s %d %d %s%s\r\n", player_print_PlayerOption(m->option), (badfield ? 1 : m->ack), m->value,(m->text && (m->text[0] == ' ' || m->text[0] == '\\')) ? "\\" : "", m->text ? m->text : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgGameOver: 
+    { CMsgGameOverMsg *m UNUSED = (CMsgGameOverMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"GameOver\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgGameOption: 
+    { CMsgGameOptionMsg *m UNUSED = (CMsgGameOptionMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"GameOption %d %s\r\n", m->id, protocol_print_GameOptionEntry(&m->optentry));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgChangeManager: 
+    { CMsgChangeManagerMsg *m UNUSED = (CMsgChangeManagerMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"ChangeManager %d %d\r\n", m->id, m->manager);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgMessage: 
+    { CMsgMessageMsg *m UNUSED = (CMsgMessageMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Message %d %d %s%s\r\n", m->sender, m->addressee,(m->text && (m->text[0] == ' ' || m->text[0] == '\\')) ? "\\" : "", m->text ? m->text : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgWall: 
+    { CMsgWallMsg *m UNUSED = (CMsgWallMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Wall %s%s\r\n",(m->wall && (m->wall[0] == ' ' || m->wall[0] == '\\')) ? "\\" : "", m->wall ? m->wall : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgComment: 
+    { CMsgCommentMsg *m UNUSED = (CMsgCommentMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"# %s%s\r\n",(m->comment && (m->comment[0] == ' ' || m->comment[0] == '\\')) ? "\\" : "", m->comment ? m->comment : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case CMsgSwapTile: 
+    { CMsgSwapTileMsg *m UNUSED = (CMsgSwapTileMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"SwapTile %d %s %s\r\n", m->id, tile_code(m->oldtile), tile_code(m->newtile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_cmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
--- /dev/null
+++ b/enc_pmsg.c
@@ -0,0 +1,516 @@
+  case PMsgSaveState: 
+    { PMsgSaveStateMsg *m UNUSED = (PMsgSaveStateMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"SaveState %s%s\r\n",(m->filename && (m->filename[0] == ' ' || m->filename[0] == '\\')) ? "\\" : "", m->filename ? m->filename : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgLoadState: 
+    { PMsgLoadStateMsg *m UNUSED = (PMsgLoadStateMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"LoadState %s%s\r\n",(m->filename && (m->filename[0] == ' ' || m->filename[0] == '\\')) ? "\\" : "", m->filename ? m->filename : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgConnect: 
+    { PMsgConnectMsg *m UNUSED = (PMsgConnectMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Connect %d %d %s%s\r\n", m->pvers, m->last_id,(m->name && (m->name[0] == ' ' || m->name[0] == '\\')) ? "\\" : "", m->name ? m->name : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgAuthInfo: 
+    { PMsgAuthInfoMsg *m UNUSED = (PMsgAuthInfoMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"AuthInfo %s %s%s\r\n", m->authtype ,(m->authdata && (m->authdata[0] == ' ' || m->authdata[0] == '\\')) ? "\\" : "", m->authdata ? m->authdata : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgNewAuthInfo: 
+    { PMsgNewAuthInfoMsg *m UNUSED = (PMsgNewAuthInfoMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"NewAuthInfo %s %s%s\r\n", m->authtype ,(m->authdata && (m->authdata[0] == ' ' || m->authdata[0] == '\\')) ? "\\" : "", m->authdata ? m->authdata : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgRequestReconnect: 
+    { PMsgRequestReconnectMsg *m UNUSED = (PMsgRequestReconnectMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"RequestReconnect\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgDisconnect: 
+    { PMsgDisconnectMsg *m UNUSED = (PMsgDisconnectMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Disconnect\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgDeclareSpecial: 
+    { PMsgDeclareSpecialMsg *m UNUSED = (PMsgDeclareSpecialMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"DeclareSpecial %s\r\n", tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgRequestPause: 
+    { PMsgRequestPauseMsg *m UNUSED = (PMsgRequestPauseMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"RequestPause %s%s\r\n",(m->reason && (m->reason[0] == ' ' || m->reason[0] == '\\')) ? "\\" : "", m->reason ? m->reason : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgReady: 
+    { PMsgReadyMsg *m UNUSED = (PMsgReadyMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Ready\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgDiscard: 
+    { PMsgDiscardMsg *m UNUSED = (PMsgDiscardMsg *) msg;
+    badfield = 0;
+    if ( m->calling < 0 || m->calling > 1 ) { warn("bad boolean in message, assuming TRUE"); badfield = 1 ; };
+      while (1) {
+        int size = snprintf(buf,buf_size,"Discard %s %d\r\n", tile_code(m->tile), (badfield ? 1 : m->calling));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgNoClaim: 
+    { PMsgNoClaimMsg *m UNUSED = (PMsgNoClaimMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"NoClaim %d\r\n", m->discard);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgPung: 
+    { PMsgPungMsg *m UNUSED = (PMsgPungMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Pung %d\r\n", m->discard);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgFormClosedPung: 
+    { PMsgFormClosedPungMsg *m UNUSED = (PMsgFormClosedPungMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"FormClosedPung %s\r\n", tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgKong: 
+    { PMsgKongMsg *m UNUSED = (PMsgKongMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Kong %d\r\n", m->discard);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgDeclareClosedKong: 
+    { PMsgDeclareClosedKongMsg *m UNUSED = (PMsgDeclareClosedKongMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"DeclareClosedKong %s\r\n", tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgAddToPung: 
+    { PMsgAddToPungMsg *m UNUSED = (PMsgAddToPungMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"AddToPung %s\r\n", tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgQueryMahJong: 
+    { PMsgQueryMahJongMsg *m UNUSED = (PMsgQueryMahJongMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"QueryMahJong %s\r\n", tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgChow: 
+    { PMsgChowMsg *m UNUSED = (PMsgChowMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Chow %d %s\r\n", m->discard, cpos_string(m->cpos));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgFormClosedChow: 
+    { PMsgFormClosedChowMsg *m UNUSED = (PMsgFormClosedChowMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"FormClosedChow %s\r\n", tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgDeclareWashOut: 
+    { PMsgDeclareWashOutMsg *m UNUSED = (PMsgDeclareWashOutMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"DeclareWashOut\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgMahJong: 
+    { PMsgMahJongMsg *m UNUSED = (PMsgMahJongMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"MahJong %d\r\n", m->discard);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgPair: 
+    { PMsgPairMsg *m UNUSED = (PMsgPairMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"Pair\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgFormClosedPair: 
+    { PMsgFormClosedPairMsg *m UNUSED = (PMsgFormClosedPairMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"FormClosedPair %s\r\n", tile_code(m->tile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgSpecialSet: 
+    { PMsgSpecialSetMsg *m UNUSED = (PMsgSpecialSetMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"SpecialSet\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgFormClosedSpecialSet: 
+    { PMsgFormClosedSpecialSetMsg *m UNUSED = (PMsgFormClosedSpecialSetMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"FormClosedSpecialSet\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgShowTiles: 
+    { PMsgShowTilesMsg *m UNUSED = (PMsgShowTilesMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"ShowTiles\r\n");
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgSetPlayerOption: 
+    { PMsgSetPlayerOptionMsg *m UNUSED = (PMsgSetPlayerOptionMsg *) msg;
+    badfield = 0;
+    if ( m->ack < 0 || m->ack > 1 ) { warn("bad boolean in message, assuming TRUE"); badfield = 1 ; };
+      while (1) {
+        int size = snprintf(buf,buf_size,"SetPlayerOption %s %d %d %s%s\r\n", player_print_PlayerOption(m->option), (badfield ? 1 : m->ack), m->value,(m->text && (m->text[0] == ' ' || m->text[0] == '\\')) ? "\\" : "", m->text ? m->text : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgSetGameOption: 
+    { PMsgSetGameOptionMsg *m UNUSED = (PMsgSetGameOptionMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"SetGameOption %s %s%s\r\n", m->optname ,(m->optvalue && (m->optvalue[0] == ' ' || m->optvalue[0] == '\\')) ? "\\" : "", m->optvalue ? m->optvalue : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgQueryGameOption: 
+    { PMsgQueryGameOptionMsg *m UNUSED = (PMsgQueryGameOptionMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"QueryGameOption %s\r\n", m->optname );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgListGameOptions: 
+    { PMsgListGameOptionsMsg *m UNUSED = (PMsgListGameOptionsMsg *) msg;
+    badfield = 0;
+    if ( m->include_disabled < 0 || m->include_disabled > 1 ) { warn("bad boolean in message, assuming TRUE"); badfield = 1 ; };
+      while (1) {
+        int size = snprintf(buf,buf_size,"ListGameOptions %d\r\n", (badfield ? 1 : m->include_disabled));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgChangeManager: 
+    { PMsgChangeManagerMsg *m UNUSED = (PMsgChangeManagerMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"ChangeManager %d\r\n", m->manager);
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgSendMessage: 
+    { PMsgSendMessageMsg *m UNUSED = (PMsgSendMessageMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"SendMessage %d %s%s\r\n", m->addressee,(m->text && (m->text[0] == ' ' || m->text[0] == '\\')) ? "\\" : "", m->text ? m->text : "" );
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
+  case PMsgSwapTile: 
+    { PMsgSwapTileMsg *m UNUSED = (PMsgSwapTileMsg *) msg;
+      while (1) {
+        int size = snprintf(buf,buf_size,"SwapTile %d %s %s\r\n", m->id, tile_code(m->oldtile), tile_code(m->newtile));
+        if ((size >= 0)&&(size < (int)buf_size))
+          break;
+        buf_size = (size >= 0)?((size_t)size+1):(buf_size > 0)?(buf_size*2):1024;
+        buf = realloc(buf, buf_size);
+        if (!buf) {
+          perror("encode_pmsg");
+          exit(-1);
+        }
+      }
+    }
+    break;
--- /dev/null
+++ b/fbtiles.c
@@ -0,0 +1,2149 @@
+/* XPM */
+static char *pm_99[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 1 1",
+/* colors */
+"  c #FF0000",
+/* pixels */
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         "
+};
+/* XPM */
+static char *pm_0[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 1 1",
+/* colors */
+"  c #948D13",
+/* pixels */
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         "
+};
+/* XPM */
+static char *pm_11[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #B00000",
+". c #EAEAEA",
+"X c #063A30",
+/* pixels */
+".........................",
+"...X........... . . . ...",
+"...X..... .X.... . . . ..",
+"..XX.   .  X... . . . . .",
+".XX.....  ..X. . . .   . ",
+".XX.....    X..     . . .",
+".XX...  . ..X. . . .   . ",
+"X.X.. . . ...X.       . .",
+"X.X.. ... X..X X X   .   ",
+"X.X.. .. ..X.X.XX .     .",
+"X.X.. .X...X.X X  X .  . ",
+"X.X.. ..X..X.X.X X X  . .",
+"X..X. ..X..XXXXXXXX  . . ",
+"X.XX. ..X.X . . .XX  .. .",
+"X .X. ..XXX X X XXX.. ...",
+"X. XXXX.X. . . . XX......",
+"X .XX.X.XX X X X XXXX....",
+"X. XX.X.X . . . .XXXXX...",
+"X .XX...XXXXXXXXX.XX..XX.",
+"X.XXX...XXX. . XX...X...X",
+"XXX.XX..XX. . .X.XX..X...",
+"XX...XXXXX . . .X.XXX....",
+"X.........X . .X.X.X.XX..",
+".......... XXXXXXXXXXXXXX",
+".........  ..  .  .......",
+"........  . .. .. .......",
+"....... ... .. ... ......",
+"......  ....... .........",
+"...... . ...... .........",
+"...... ...XXXXX X........",
+"...XXXX XX.... ..X.X.X...",
+".X.X.......... ..X..X....",
+"..XX....... . ...XXX.X...",
+"...XX.......  .....X...X.",
+"XXXX.....   .. .....XXXXX"
+};
+/* XPM */
+static char *pm_12[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #EAEAEA",
+". c #063A30",
+/* pixels */
+"          .....          ",
+"         ... ...         ",
+"          .. ..          ",
+"           . .           ",
+"           . .           ",
+"           . .           ",
+"          .....          ",
+"         ... ...         ",
+"          .....          ",
+"           . .           ",
+"           . .           ",
+"           . .           ",
+"          .. ..          ",
+"         ... ...         ",
+"          .....          ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"          .....          ",
+"         ... ...         ",
+"          .. ..          ",
+"           . .           ",
+"           . .           ",
+"           . .           ",
+"          .....          ",
+"         ... ...         ",
+"          .....          ",
+"           . .           ",
+"           . .           ",
+"           . .           ",
+"          .. ..          ",
+"         ... ...         ",
+"          .....          "
+};
+/* XPM */
+static char *pm_13[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #EAEAEA",
+". c #063A30",
+/* pixels */
+"          .....          ",
+"         ... ...         ",
+"          .. ..          ",
+"           . .           ",
+"           . .           ",
+"           . .           ",
+"          .....          ",
+"         ... ...         ",
+"          .....          ",
+"           . .           ",
+"           . .           ",
+"           . .           ",
+"          .. ..          ",
+"         ... ...         ",
+"          .....          ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+" .....             ..... ",
+"... ...           ... ...",
+" .. ..             .. .. ",
+"  . .               . .  ",
+"  . .               . .  ",
+"  . .               . .  ",
+" .....             ..... ",
+"... ...           ... ...",
+" .....             ..... ",
+"  . .               . .  ",
+"  . .               . .  ",
+"  . .               . .  ",
+" .. ..             .. .. ",
+"... ...           ... ...",
+" .....             ..... "
+};
+/* XPM */
+static char *pm_14[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #EAEAEA",
+". c #063A30",
+/* pixels */
+"   .....         .....   ",
+"  ... ...       ... ...  ",
+"   .. ..         .. ..   ",
+"    . .           . .    ",
+"    . .           . .    ",
+"    . .           . .    ",
+"   .....         .....   ",
+"  ... ...       ... ...  ",
+"   .....         .....   ",
+"    . .           . .    ",
+"    . .           . .    ",
+"    . .           . .    ",
+"   .. ..         .. ..   ",
+"  ... ...       ... ...  ",
+"   .....         .....   ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"   .....         .....   ",
+"  ... ...       ... ...  ",
+"   .. ..         .. ..   ",
+"    . .           . .    ",
+"    . .           . .    ",
+"    . .           . .    ",
+"   .....         .....   ",
+"  ... ...       ... ...  ",
+"   .....         .....   ",
+"    . .           . .    ",
+"    . .           . .    ",
+"    . .           . .    ",
+"   .. ..         .. ..   ",
+"  ... ...       ... ...  ",
+"   .....         .....   "
+};
+/* XPM */
+static char *pm_15[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #B00000",
+". c #EAEAEA",
+"X c #063A30",
+/* pixels */
+".XXXXX.............XXXXX.",
+"XXX.XXX...........XXX.XXX",
+".XX.XX.............XX.XX.",
+"..X.X...............X.X..",
+"..X.X...............X.X..",
+"..X.X...............X.X..",
+".XXXXX.............XXXXX.",
+"XXX.XXX...........XXX.XXX",
+".XXXXX.............XXXXX.",
+"..X.X...............X.X..",
+"..X.X.....     .....X.X..",
+"..X.X....   .   ....X.X..",
+".XX.XX....  .  ....XX.XX.",
+"XXX.XXX.... . ....XXX.XXX",
+".XXXXX..... . .....XXXXX.",
+"........... . ...........",
+"..........     ..........",
+".........   .   .........",
+"..........     ..........",
+"........... . ...........",
+".XXXXX..... . .....XXXXX.",
+"XXX.XXX.... . ....XXX.XXX",
+".XX.XX....  .  ....XX.XX.",
+"..X.X....   .   ....X.X..",
+"..X.X.....     .....X.X..",
+"..X.X...............X.X..",
+".XXXXX.............XXXXX.",
+"XXX.XXX...........XXX.XXX",
+".XXXXX.............XXXXX.",
+"..X.X...............X.X..",
+"..X.X...............X.X..",
+"..X.X...............X.X..",
+".XX.XX.............XX.XX.",
+"XXX.XXX...........XXX.XXX",
+".XXXXX.............XXXXX."
+};
+/* XPM */
+static char *pm_16[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #EAEAEA",
+". c #063A30",
+/* pixels */
+" .....    .....    ..... ",
+"... ...  ... ...  ... ...",
+" .. ..    .. ..    .. .. ",
+"  . .      . .      . .  ",
+"  . .      . .      . .  ",
+"  . .      . .      . .  ",
+" .....    .....    ..... ",
+"... ..   ... ...  ... ...",
+" .....    .....    ..... ",
+"  . .      . .      . .  ",
+"  . .      . .      . .  ",
+"  . .      . .      . .  ",
+" .. ..    .. ..    .. .. ",
+"... ...  ... ...  ... ...",
+" .....    .....    ..... ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+" .....    .....    ..... ",
+"... ...  ... ...  ... ...",
+" .. ..    .. ..    .. .. ",
+"  . .      . .      . .  ",
+"  . .      . .      . .  ",
+"  . .      . .      . .  ",
+" .....    .....    ..... ",
+"... ..   ... ...  ... ...",
+" .....    .....    ..... ",
+"  . .      . .      . .  ",
+"  . .      . .      . .  ",
+"  . .      . .      . .  ",
+" .. ..    .. ..    .. .. ",
+"... ...  ... ...  ... ...",
+" .....    .....    ..... "
+};
+/* XPM */
+static char *pm_17[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #B00000",
+". c #EAEAEA",
+"X c #063A30",
+/* pixels */
+"..........     ..........",
+".........   .   .........",
+"..........  .  ..........",
+"........... . ...........",
+"..........     ..........",
+".........   .   .........",
+"..........     ..........",
+"........... . ...........",
+"..........  .  ..........",
+".........   .   .........",
+"..........     ..........",
+".........................",
+".XXXXX....XXXXX....XXXXX.",
+"XXX.XXX..XXX.XXX..XXX.XXX",
+".XX.XX....XX.XX....XX.XX.",
+"..X.X......X.X......X.X..",
+".XXXXX....XXXXX....XXXXX.",
+"XXX.XXX..XXX.XXX..XXX.XXX",
+".XXXXX....XXXXX....XXXXX.",
+"..X.X......X.X......X.X..",
+".XX.XX....XX.XX....XX.XX.",
+"XXX.XXX..XXX.XXX..XXX.XXX",
+".XXXXX....XXXXX....XXXXX.",
+".........................",
+".XXXXX....XXXXX....XXXXX.",
+"XXX.XXX..XXX.XXX..XXX.XXX",
+".XX.XX....XX.XX....XX.XX.",
+"..X.X......X.X......X.X..",
+".XXXXX....XXXXX....XXXXX.",
+"XXX.XXX..XXX.XXX..XXX.XXX",
+".XXXXX....XXXXX....XXXXX.",
+"..X.X......X.X......X.X..",
+".XX.XX....XX.XX....XX.XX.",
+"XXX.XXX..XXX.XXX..XXX.XXX",
+".XXXXX....XXXXX....XXXXX."
+};
+/* XPM */
+static char *pm_18[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #EAEAEA",
+". c #063A30",
+/* pixels */
+" .....             ..... ",
+"... ...           ... ...",
+" .. ..             .. .. ",
+"  . .               . .  ",
+"  . .     .....     . .  ",
+"  . .     .. ..     . .  ",
+" .....    . ...    ..... ",
+"... ... .. ... .. ... ...",
+" ..... ....   .... ..... ",
+"  . . .. ..   .. .. . .  ",
+"  . . ....     .... . .  ",
+"  . .. ..       .. .. .  ",
+" .. . .           ... .. ",
+"... ...           ... ...",
+" .....             ..... ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+" .....             ..... ",
+"... ...           ... ...",
+" .. . .           . . .. ",
+"  . .. ..       .. .. .  ",
+"  . . ....     .... . .  ",
+"  . . .. ..   .. .. . .  ",
+" ..... ....   .... ..... ",
+"... ... .. ... .. ... ...",
+" .....    ... .    ..... ",
+"  . .     .. ..     . .  ",
+"  . .     .....     . .  ",
+"  . .               . .  ",
+" .. ..             .. .. ",
+"... ...           ... ...",
+" .....             ..... "
+};
+/* XPM */
+static char *pm_19[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #B00000",
+". c #EAEAEA",
+"X c #063A30",
+/* pixels */
+".XXXXX....     ....XXXXX.",
+"XXX.XXX..   .   ..XXX.XXX",
+".XX.XX....  .  ....XX.XX.",
+"..X.X...... . ......X.X..",
+".XXXXX....     ....XXXXX.",
+"XXX.XXX..   .   ..XXX.XXX",
+".XXXXX....     ....XXXXX.",
+"..X.X...... . ......X.X..",
+".XX.XX....  .  ....XX.XX.",
+"XXX.XXX..   .   ..XXX.XXX",
+".XXXXX....     ....XXXXX.",
+".........................",
+".XXXXX....     ....XXXXX.",
+"XXX.XXX..   .   ..XXX.XXX",
+".XX.XX....  .  ....XX.XX.",
+"..X.X...... . ......X.X..",
+".XXXXX....     ....XXXXX.",
+"XXX.XXX..   .   ..XXX.XXX",
+".XXXXX....     ....XXXXX.",
+"..X.X...... . ......X.X..",
+".XX.XX....  .  ....XX.XX.",
+"XXX.XXX..   .   ..XXX.XXX",
+".XXXXX....     ....XXXXX.",
+".........................",
+".XXXXX....     ....XXXXX.",
+"XXX.XXX..   .   ..XXX.XXX",
+".XX.XX....  .  ....XX.XX.",
+"..X.X...... . ......X.X..",
+".XXXXX....     ....XXXXX.",
+"XXX.XXX..   .   ..XXX.XXX",
+".XXXXX....     ....XXXXX.",
+"..X.X...... . ......X.X..",
+".XX.XX....  .  ....XX.XX.",
+"XXX.XXX..   .   ..XXX.XXX",
+".XXXXX....     ....XXXXX."
+};
+/* XPM */
+static char *pm_21[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXX  XXXXX",
+"XXXXXXXXXXX           XXX",
+"XX          XXXXXXXX   XX",
+"XXX    XXXXXXXXXXXXX   XX",
+"XXXX XXXXXXXXXXXXXXXX  XX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX.XXXXXXXXXXX",
+"XXXXXXXXXXXX....XXXXXXXXX",
+"XXXXXXXX.XX.XX..XXXXXXXXX",
+"XXXXXXXX..XXX..XXXXXXXXXX",
+"XXXXXXXXX.X......XXXXXXXX",
+"XXXXXXX.....X.XXXXXXXXXXX",
+"XXXXXXXXXXX.....XXXXXXXXX",
+"XXXXXXX.X....XX..XXXXXXXX",
+"XXXXXXX..XX......XXXXXXXX",
+"XXXXXXXX.X...X...XXXXXXXX",
+"XXXXXXXX..XX....XXXXXXXXX",
+"XXXXXXXX.....XX....XXXXXX",
+"XXXX..XXX.X.....XX...XXXX",
+"XXXXX.........XX.XX...XXX",
+"XX.....XXXXX.X....XX...XX",
+"XXX.X..........X..XX...XX",
+"XXXXX.XX..XXXXXX..XX...XX",
+"XXXXXXXXXXXXXX....X...XXX",
+"XXXXXXXXXXXXXXXX.....XXXX"
+};
+/* XPM */
+static char *pm_22[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX   XXXXXXXXX",
+"XXXXXXXXXX       XXXXXXXX",
+"XXXXX      XXXXXXXXXXXXXX",
+"XXXXXXX  XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXX  XXXXXX",
+"XXXXXXXXXXX          XXXX",
+"XXX         XXXXXXX   XXX",
+"XXXX    XXXXXXXXXXX   XXX",
+"XXXXX XXXXXXXXXXXXXX  XXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX.XXXXXXXXXXX",
+"XXXXXXXXXXXX....XXXXXXXXX",
+"XXXXXXXX.XX.XX..XXXXXXXXX",
+"XXXXXXXX..XXX..XXXXXXXXXX",
+"XXXXXXXXX.X......XXXXXXXX",
+"XXXXXXX.....X.XXXXXXXXXXX",
+"XXXXXXXXXXX.....XXXXXXXXX",
+"XXXXXXX.X....XX..XXXXXXXX",
+"XXXXXXX..XX......XXXXXXXX",
+"XXXXXXXX.X...X...XXXXXXXX",
+"XXXXXXXX..XX....XXXXXXXXX",
+"XXXXXXXX.....XX....XXXXXX",
+"XXXX..XXX.X.....XX...XXXX",
+"XXXXX.........XX.XX...XXX",
+"XX.....XXXXX.X....XX...XX",
+"XXX.X..........X..XX...XX",
+"XXXXX.XX..XXXXXX..XX...XX",
+"XXXXXXXXXXXXXX....X...XXX",
+"XXXXXXXXXXXXXXXX.....XXXX"
+};
+/* XPM */
+static char *pm_23[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXX  XXXXXXXXX",
+"XXXXXXXXXXX       XXXXXXX",
+"XXXXXXXX    XXXX  XXXXXXX",
+"XXXXXX   XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX   XXXXXXXXX",
+"XXXXXXXXXX       XXXXXXXX",
+"XXXXXXXX   XXXX XXXXXXXXX",
+"XXXXXXXX XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXX   XXXXXXX",
+"XXXXXXXXX           XXXXX",
+"XXXX      XXXXXXXX   XXXX",
+"XXXXX  XXXXXXXXXXXX  XXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX.XXXXXXXXXXX",
+"XXXXXXXXXXXX....XXXXXXXXX",
+"XXXXXXXX.XX.XX..XXXXXXXXX",
+"XXXXXXXX..XXX..XXXXXXXXXX",
+"XXXXXXXXX.X......XXXXXXXX",
+"XXXXXXX.....X.XXXXXXXXXXX",
+"XXXXXXXXXXX.....XXXXXXXXX",
+"XXXXXXX.X....XX..XXXXXXXX",
+"XXXXXXX..XX......XXXXXXXX",
+"XXXXXXXX.X...X...XXXXXXXX",
+"XXXXXXXX..XX....XXXXXXXXX",
+"XXXXXXXX.....XX....XXXXXX",
+"XXXX..XXX.X.....XX...XXXX",
+"XXXXX.........XX.XX...XXX",
+"XX.....XXXXX.X....XX...XX",
+"XXX.X..........X..XX...XX",
+"XXXXX.XX..XXXXXX..XX...XX",
+"XXXXXXXXXXXXXX....X...XXX",
+"XXXXXXXXXXXXXXXX.....XXXX"
+};
+/* XPM */
+static char *pm_24[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXX         XXXXX",
+"XXXX XX     XX  XX   XXXX",
+"XXX       XXXX   XX   XXX",
+"XXX   XX   XXX   XX   XXX",
+"XXX   XXX   XX  XX    XXX",
+"XXXX  XXXX  X  XXX   XXXX",
+"XXXXX  XX           XXXXX",
+"XXXXXX    XXXXXXX  XXXXXX",
+"XXXXXXX XXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX.XXXXXXXXXXX",
+"XXXXXXXXXXXX....XXXXXXXXX",
+"XXXXXXXX.XX.XX..XXXXXXXXX",
+"XXXXXXXX..XXX..XXXXXXXXXX",
+"XXXXXXXXX.X......XXXXXXXX",
+"XXXXXXX.....X.XXXXXXXXXXX",
+"XXXXXXXXXXX.....XXXXXXXXX",
+"XXXXXXX.X....XX..XXXXXXXX",
+"XXXXXXX..XX......XXXXXXXX",
+"XXXXXXXX.X...X...XXXXXXXX",
+"XXXXXXXX..XX....XXXXXXXXX",
+"XXXXXXXX.....XX....XXXXXX",
+"XXXX..XXX.X.....XX...XXXX",
+"XXXXX.........XX.XX...XXX",
+"XX.....XXXXX.X....XX...XX",
+"XXX.X..........X..XX...XX",
+"XXXXX.XX..XXXXXX..XX...XX",
+"XXXXXXXXXXXXXX....X...XXX",
+"XXXXXXXXXXXXXXXX.....XXXX"
+};
+/* XPM */
+static char *pm_25[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXX XXXXXXXXX",
+"XXXXXXXXXXXXXX    XXXXXXX",
+"XXXXXX  XXXX       XXXXXX",
+"XXXXXXX  X     XXXXXXXXXX",
+"XXXXXX   XXXX  XXXXXXXXXX",
+"XXXXXX   XXX  X  XXXXXXXX",
+"XXXXXX  XXXX      XXXXXXX",
+"XXXXX   X          XXXXXX",
+"XXXXX   XX   XX  XXXXXXXX",
+"XXXX  X XXX XX  X   XXXXX",
+"XXXX XX XX            XXX",
+"XXX XX      XXXXXXX    XX",
+"XX XXX  XXXXXXXXXXXX   XX",
+"XXXXXXX XXXXXXXXXXXXX XXX",
+"XXXXXXXXXXXXX.XXXXXXXXXXX",
+"XXXXXXXXXXXX....XXXXXXXXX",
+"XXXXXXXX.XX.XX..XXXXXXXXX",
+"XXXXXXXX..XXX..XXXXXXXXXX",
+"XXXXXXXXX.X......XXXXXXXX",
+"XXXXXXX.....X.XXXXXXXXXXX",
+"XXXXXXXXXXX.....XXXXXXXXX",
+"XXXXXXX.X....XX..XXXXXXXX",
+"XXXXXXX..XX......XXXXXXXX",
+"XXXXXXXX.X...X...XXXXXXXX",
+"XXXXXXXX..XX....XXXXXXXXX",
+"XXXXXXXX.....XX....XXXXXX",
+"XXXX..XXX.X.....XX...XXXX",
+"XXXXX.........XX.XX...XXX",
+"XX.....XXXXX.X....XX...XX",
+"XXX.X..........X..XX...XX",
+"XXXXX.XX..XXXXXX..XX...XX",
+"XXXXXXXXXXXXXX....X...XXX",
+"XXXXXXXXXXXXXXXX.....XXXX"
+};
+/* XPM */
+static char *pm_26[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXX  XXXXXXXXXXXX",
+"XXXXXXXXXXXX  XXXXXXXXXXX",
+"XXXXXXXXXXXX   XX XXXXXXX",
+"XXXXXXXXXXXX  XX   XXXXXX",
+"XXXXXXXXXXX         XXXXX",
+"XXXX         XXXXX   XXXX",
+"XXXXX  XXXX XXXXXX   XXXX",
+"XXXXXXXX  XXX   XXX XXXXX",
+"XXXXXXXXX   XX   XXXXXXXX",
+"XXXXXXXXX  XXXX    XXXXXX",
+"XXXXXXXX  XXXXXX   XXXXXX",
+"XXXXXXX  XXXXXXXX  XXXXXX",
+"XXXXXX XXXXXXXXXXX XXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX.XXXXXXXXXXX",
+"XXXXXXXXXXXX....XXXXXXXXX",
+"XXXXXXXX.XX.XX..XXXXXXXXX",
+"XXXXXXXX..XXX..XXXXXXXXXX",
+"XXXXXXXXX.X......XXXXXXXX",
+"XXXXXXX.....X.XXXXXXXXXXX",
+"XXXXXXXXXXX.....XXXXXXXXX",
+"XXXXXXX.X....XX..XXXXXXXX",
+"XXXXXXX..XX......XXXXXXXX",
+"XXXXXXXX.X...X...XXXXXXXX",
+"XXXXXXXX..XX....XXXXXXXXX",
+"XXXXXXXX.....XX....XXXXXX",
+"XXXX..XXX.X.....XX...XXXX",
+"XXXXX.........XX.XX...XXX",
+"XX.....XXXXX.X....XX...XX",
+"XXX.X..........X..XX...XX",
+"XXXXX.XX..XXXXXX..XX...XX",
+"XXXXXXXXXXXXXX....X...XXX",
+"XXXXXXXXXXXXXXXX.....XXXX"
+};
+/* XPM */
+static char *pm_27[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXX XXXXXXXX     XXX",
+"XXXXXXXX   XXXXX     XXXX",
+"XXXXXXXXX  XXXX  XXXXXXXX",
+"XXXXXXXXX  XXX XXXXXXXXXX",
+"XXXXXXXXXX XX XXXXXXXXXXX",
+"XXXXXXXXXX X XXXXXXXXXXXX",
+"XXXXXXXXXX  XXXXXXXXXXXXX",
+"XXXXXXXXX    XX  XXXXXXXX",
+"XXXXXXXX  X       XXXXXXX",
+"XXXXXX   XXX       XXXXXX",
+"XXX    XXXXXX     XXXXXXX",
+"XXXX  XXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX.XXXXXXXXXXX",
+"XXXXXXXXXXXX....XXXXXXXXX",
+"XXXXXXXX.XX.XX..XXXXXXXXX",
+"XXXXXXXX..XXX..XXXXXXXXXX",
+"XXXXXXXXX.X......XXXXXXXX",
+"XXXXXXX.....X.XXXXXXXXXXX",
+"XXXXXXXXXXX.....XXXXXXXXX",
+"XXXXXXX.X....XX..XXXXXXXX",
+"XXXXXXX..XX......XXXXXXXX",
+"XXXXXXXX.X...X...XXXXXXXX",
+"XXXXXXXX..XX....XXXXXXXXX",
+"XXXXXXXX.....XX....XXXXXX",
+"XXXX..XXX.X.....XX...XXXX",
+"XXXXX.........XX.XX...XXX",
+"XX.....XXXXX.X....XX...XX",
+"XXX.X..........X..XX...XX",
+"XXXXX.XX..XXXXXX..XX...XX",
+"XXXXXXXXXXXXXX....X...XXX",
+"XXXXXXXXXXXXXXXX.....XXXX"
+};
+/* XPM */
+static char *pm_28[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXX XXXXXXXXXXXX",
+"XXXXXXXXXX    XXXXXXXXXXX",
+"XXXXXXXXXXXX XXXXXXXXXXXX",
+"XXXXXXXXXXXXX XXXXXXXXXXX",
+"XXXXXXX XXXXX  XXXXXXXXXX",
+"XXXXXXXX  XXXX  XXXXXXXXX",
+"XXXXXXX    XXXX   XXXXXXX",
+"XXXXXXX  X XXXXX     XXXX",
+"XXXXXX  XXXXXXXXX       X",
+"XXXX  XXXXXXXXXXXX    XXX",
+"X   XXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX.XXXXXXXXXXX",
+"XXXXXXXXXXXX....XXXXXXXXX",
+"XXXXXXXX.XX.XX..XXXXXXXXX",
+"XXXXXXXX..XXX..XXXXXXXXXX",
+"XXXXXXXXX.X......XXXXXXXX",
+"XXXXXXX.....X.XXXXXXXXXXX",
+"XXXXXXXXXXX.....XXXXXXXXX",
+"XXXXXXX.X....XX..XXXXXXXX",
+"XXXXXXX..XX......XXXXXXXX",
+"XXXXXXXX.X...X...XXXXXXXX",
+"XXXXXXXX..XX....XXXXXXXXX",
+"XXXXXXXX.....XX....XXXXXX",
+"XXXX..XXX.X.....XX...XXXX",
+"XXXXX.........XX.XX...XXX",
+"XX.....XXXXX.X....XX...XX",
+"XXX.X..........X..XX...XX",
+"XXXXX.XX..XXXXXX..XX...XX",
+"XXXXXXXXXXXXXX....X...XXX",
+"XXXXXXXXXXXXXXXX.....XXXX"
+};
+/* XPM */
+static char *pm_29[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXX    XXX  XXXXXXXXX",
+"XXXXXXXX    XXX   XXXXXXX",
+"XXXXXXXXX  XXX     XXXXXX",
+"XXXXXXXXX       X  XXXXXX",
+"XXXXX          XXXXXXXXXX",
+"XXXXXXXXX  XX XXXXX XXXXX",
+"XXXXXXXX   XX XXXXX XXXXX",
+"XXXXXXXX  XXX XXXXX  XXXX",
+"XXXXXXX  XXXX  XXX   XXXX",
+"XXXXXX  XXXXXX        XXX",
+"XXXXX  XXXXXXXX      XXXX",
+"XXX  XXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXX.XXXXXXXXXXX",
+"XXXXXXXXXXXX....XXXXXXXXX",
+"XXXXXXXX.XX.XX..XXXXXXXXX",
+"XXXXXXXX..XXX..XXXXXXXXXX",
+"XXXXXXXXX.X......XXXXXXXX",
+"XXXXXXX.....X.XXXXXXXXXXX",
+"XXXXXXXXXXX.....XXXXXXXXX",
+"XXXXXXX.X....XX..XXXXXXXX",
+"XXXXXXX..XX......XXXXXXXX",
+"XXXXXXXX.X...X...XXXXXXXX",
+"XXXXXXXX..XX....XXXXXXXXX",
+"XXXXXXXX.....XX....XXXXXX",
+"XXXX..XXX.X.....XX...XXXX",
+"XXXXX.........XX.XX...XXX",
+"XX.....XXXXX.X....XX...XX",
+"XXX.X..........X..XX...XX",
+"XXXXX.XX..XXXXXX..XX...XX",
+"XXXXXXXXXXXXXX....X...XXX",
+"XXXXXXXXXXXXXXXX.....XXXX"
+};
+/* XPM */
+static char *pm_31[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #002065",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXX       XXXXXXXXX",
+"XXXXXXX  X X X X  XXXXXXX",
+"XXXXXX X  X X X  X XXXXXX",
+"XXXXX   XX X X XX   XXXXX",
+"XXXX  XX X     X XX  XXXX",
+"XXX X XX         XX X XXX",
+"XXX  X    .....    X  XXX",
+"XX X XX  ..X.X..  XX X XX",
+"XX  X   ..X.X.X..   X  XX",
+"XX X X  .X.....X.  X X XX",
+"XX  X   ..X.X.X..   X  XX",
+"XX X X  .X.....X.  X X XX",
+"XX  X   ..X.X.X..   X  XX",
+"XX X XX  ..X.X..  XX X XX",
+"XXX  X    .....    X  XXX",
+"XXX X XX         XX X XXX",
+"XXXX  XX X     X XX  XXXX",
+"XXXXX   XX X X XX   XXXXX",
+"XXXXXX X  X X X  X XXXXXX",
+"XXXXXXX  X X X X  XXXXXXX",
+"XXXXXXXXX       XXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_32[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #002065",
+". c #EAEAEA",
+/* pixels */
+".........................",
+".........................",
+".........................",
+"..........     ..........",
+".........  ...  .........",
+"........ ..   .. ........",
+"....... .       . .......",
+"......  . . . . .  ......",
+"...... .   . .   . ......",
+"...... .  . . .  . ......",
+"...... .   . .   . ......",
+"......  . . . . .  ......",
+"....... .       . .......",
+"........ ..   .. ........",
+".........  ...  .........",
+"..........     ..........",
+".........................",
+".........................",
+".........................",
+"..........     ..........",
+".........  ...  .........",
+"........ ..   .. ........",
+"....... .       . .......",
+"......  . . . . .  ......",
+"...... .   . .   . ......",
+"...... .  . . .  . ......",
+"...... .   . .   . ......",
+"......  . . . . .  ......",
+"....... .       . .......",
+"........ ..   .. ........",
+".........  ...  .........",
+"..........     ..........",
+".........................",
+".........................",
+"........................."
+};
+/* XPM */
+static char *pm_33[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #002065",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX     XXXXXXXXXXXXXXXXX",
+"XX  XXX  XXXXXXXXXXXXXXXX",
+"X  X   X  XXXXXXXXXXXXXXX",
+"  X X X X  XXXXXXXXXXXXXX",
+" X X X X X XXXXXXXXXXXXXX",
+" X  X X  X XXXXXXXXXXXXXX",
+" X X X X X XXXXXXXXXXXXXX",
+"  X X X X  XXXXXXXXXXXXXX",
+"X  X   X  XXXXXXXXXXXXXXX",
+"XX  XXX  XXXXXXXXXXXXXXXX",
+"XXX     XXXXXXXXXXXXXXXXX",
+"XXXXXXXXXX.....XXXXXXXXXX",
+"XXXXXXXXX..XXX..XXXXXXXXX",
+"XXXXXXXX..X...X..XXXXXXXX",
+"XXXXXXX..X.X.X.X..XXXXXXX",
+"XXXXXXX.X.X.X.X.X.XXXXXXX",
+"XXXXXXX.X..X.X..X.XXXXXXX",
+"XXXXXXX.X.X.X.X.X.XXXXXXX",
+"XXXXXXX..X.X.X.X..XXXXXXX",
+"XXXXXXXX..X...X..XXXXXXXX",
+"XXXXXXXXX..XXX..XXXXXXXXX",
+"XXXXXXXXXX.....XXXXXXXXXX",
+"XXXXXXXXXXXXXXXXX     XXX",
+"XXXXXXXXXXXXXXXX  XXX  XX",
+"XXXXXXXXXXXXXXX  X   X  X",
+"XXXXXXXXXXXXXX  X X X X  ",
+"XXXXXXXXXXXXXX X X X X X ",
+"XXXXXXXXXXXXXX X  X X  X ",
+"XXXXXXXXXXXXXX X X X X X ",
+"XXXXXXXXXXXXXX  X X X X  ",
+"XXXXXXXXXXXXXXX  X   X  X",
+"XXXXXXXXXXXXXXXX  XXX  XX",
+"XXXXXXXXXXXXXXXXX     XXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_34[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #002065",
+". c #EAEAEA",
+/* pixels */
+"....     .......     ....",
+"...  ...  .....  ...  ...",
+"..  .   .  ...  .   .  ..",
+".  . . . .  .  . . . .  .",
+". . . . . . . . . . . . .",
+". .  . .  . . .  . .  . .",
+". . . . . . . . . . . . .",
+".  . . . .  .  . . . .  .",
+"..  .   .  ...  .   .  ..",
+"...  ...  .....  ...  ...",
+"....     .......     ....",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+"....     .......     ....",
+"...  ...  .....  ...  ...",
+"..  .   .  ...  .   .  ..",
+".  . . . .  .  . . . .  .",
+". . . . . . . . . . . . .",
+". .  . .  . . .  . .  . .",
+". . . . . . . . . . . . .",
+".  . . . .  .  . . . .  .",
+"..  .   .  ...  .   .  ..",
+"...  ...  .....  ...  ...",
+"....     .......     ...."
+};
+/* XPM */
+static char *pm_35[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #002065",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXX     XXXXXXX     XXXX",
+"XXX  XXX  XXXXX  XXX  XXX",
+"XX  X   X  XXX  X   X  XX",
+"X  X X X X  X  X X X X  X",
+"X X X X X X X X X X X X X",
+"X X  X X  X X X  X X  X X",
+"X X X X X X X X X X X X X",
+"X  X X X X  X  X X X X  X",
+"XX  X   X  XXX  X   X  XX",
+"XXX  XXX  XXXXX  XXX  XXX",
+"XXXX     XXXXXXX     XXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXX.....XXXXXXXXXX",
+"XXXXXXXXX..XXX..XXXXXXXXX",
+"XXXXXXXX..X...X..XXXXXXXX",
+"XXXXXXX..X.X.X.X..XXXXXXX",
+"XXXXXXX.X.X.X.X.X.XXXXXXX",
+"XXXXXXX.X..X.X..X.XXXXXXX",
+"XXXXXXX.X.X.X.X.X.XXXXXXX",
+"XXXXXXX..X.X.X.X..XXXXXXX",
+"XXXXXXXX..X...X..XXXXXXXX",
+"XXXXXXXXX..XXX..XXXXXXXXX",
+"XXXXXXXXXX.....XXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXX     XXXXXXX     XXXX",
+"XXX  XXX  XXXXX  XXX  XXX",
+"XX  X   X  XXX  X   X  XX",
+"X  X X X X  X  X X X X  X",
+"X X X X X X X X X X X X X",
+"X X  X X  X X X  X X  X X",
+"X X X X X X X X X X X X X",
+"X  X X X X  X  X X X X  X",
+"XX  X   X  XXX  X   X  XX",
+"XXX  XXX  XXXXX  XXX  XXX",
+"XXXX     XXXXXXX     XXXX"
+};
+/* XPM */
+static char *pm_36[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 4 1",
+/* colors */
+"  c #002065",
+". c #B00000",
+"X c #EAEAEA",
+"o c #FFFFFF",
+/* pixels */
+"XXXo     oXXXXXo     oXXX",
+"XXo  ooo  oXXXo  ooo  oXX",
+"Xo  o   o  oXo  o   o  oX",
+"X  o o o o  X  o o o o  X",
+"X X o o o X X X o o o X X",
+"X X  o o  X X X  o o  X X",
+"X o o o o o X o o o o o X",
+"X  o o o o  X  o o o o  X",
+"XX  o   o  XXX  o   o  XX",
+"XXX  ooo  XXXXX  ooo  XXX",
+"XXXX     XXXXXXX     XXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXX.....XXXXXXX.....XXXX",
+"XXX..ooo..XXXXX..ooo..XXX",
+"XX..o...o..XXX..o...o..XX",
+"X..o.o.o.o..X..o.o.o.o..X",
+"X.o.o.o.o.o.X.o.o.o.o.o.X",
+"X.X..o.o..X.X.X..o.o..X.X",
+"X.X.o.o.o.X.X.X.o.o.o.X.X",
+"X..o.o.o.o..X..o.o.o.o..X",
+"Xo..o...o..oXo..o...o..oX",
+"XXo..ooo..oXXXo..ooo..oXX",
+"XXXo.....oXXXXXo.....oXXX",
+"XXX..ooo..XXXXX..ooo..XXX",
+"XX..o...o..XXX..o...o..XX",
+"X..o.o.o.o..X..o.o.o.o..X",
+"X.o.o.o.o.o.X.o.o.o.o.o.X",
+"X.X..o.o..X.X.X..o.o..X.X",
+"X.X.o.o.o.X.X.X.o.o.o.X.X",
+"X..o.o.o.o..X..o.o.o.o..X",
+"Xo..o...o..oXo..o...o..oX",
+"XXo..ooo..oXXXo..ooo..oXX",
+"XXXo.....oXXXXXo.....oXXX"
+};
+/* XPM */
+static char *pm_37[] = {
+"25 35 3 1",
+".	c #EAEAEA",
+"+	c #002065",
+"@	c #B00000",
+"...+++...................",
+".++...++.................",
+".+.+++.+.................",
+"+.++.++.+..+++...........",
+"+.+.+.+.+++...++.........",
+"+.++.++.++.+++.+.........",
+".+.+++.++.++.++.+..+++...",
+".++...+++.+.+.+.+++...++.",
+"...+++..+.++.++.++.+++.+.",
+".........+.+++.++.++.++.+",
+".........++...+++.+.+.+.+",
+"...........+++..+.++.++.+",
+".................+.+++.+.",
+".................++...++.",
+"...................+++...",
+".........................",
+".....@@@.........@@@.....",
+"...@@...@@.....@@...@@...",
+"...@.@@@.@.....@.@@@.@...",
+"..@.@@.@@.@...@.@@.@@.@..",
+"..@.@.@.@.@...@.@.@.@.@..",
+"..@.@@.@@.@...@.@@.@@.@..",
+"...@.@@@.@.....@.@@@.@...",
+"...@@...@@.....@@...@@...",
+".....@@@.........@@@.....",
+".....@@@.........@@@.....",
+"...@@...@@.....@@...@@...",
+"...@.@@@.@.....@.@@@.@...",
+"..@.@@.@@.@...@.@@.@@.@..",
+"..@.@.@.@.@...@.@.@.@.@..",
+"..@.@@.@@.@...@.@@.@@.@..",
+"...@.@@@.@.....@.@@@.@...",
+"...@@...@@.....@@...@@...",
+".....@@@.........@@@.....",
+"........................."};
+/* XPM */
+static char *pm_38[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #002065",
+". c #EAEAEA",
+/* pixels */
+".........................",
+"......   .......   ......",
+"....  ...  ...  ...  ....",
+".... .   . ... .   . ....",
+"... .  .  . . .  .  . ...",
+"... . . . . . . . . . ...",
+"... .  .  . . .  .  . ...",
+".... .   . ... .   . ....",
+"....  ...  ...  ...  ....",
+"......   .......   ......",
+"....  ...  ...  ...  ....",
+".... .   . ... .   . ....",
+"... .  .  . . .  .  . ...",
+"... . . . . . . . . . ...",
+"... .  .  . . .  .  . ...",
+".... .   . ... .   . ....",
+"....  ...  ...  ...  ....",
+"......   .......   ......",
+"....  ...  ...  ...  ....",
+".... .   . ... .   . ....",
+"... .  .  . . .  .  . ...",
+"... . . . . . . . . . ...",
+"... .  .  . . .  .  . ...",
+".... .   . ... .   . ....",
+"....  ...  ...  ...  ....",
+"......   .......   ......",
+"....  ...  ...  ...  ....",
+".... .   . ... .   . ....",
+"... .  .  . . .  .  . ...",
+"... . . . . . . . . . ...",
+"... .  .  . . .  .  . ...",
+".... .   . ... .   . ....",
+"....  ...  ...  ...  ....",
+"......   .......   ......",
+"........................."
+};
+/* XPM */
+static char *pm_39[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 3 1",
+/* colors */
+"  c #002065",
+". c #B00000",
+"X c #EAEAEA",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX   XXXXX   XXXXX   XXX",
+"X  XXX  X  XXX  X  XXX  X",
+"X X   X X X   X X X   X X",
+" X  X  X X  X  X X  X  X ",
+" X X X X X X X X X X X X ",
+" X  X  X X  X  X X  X  X ",
+"X X   X X X   X X X   X X",
+"X  XXX  X  XXX  X  XXX  X",
+"XXX   XXXXX   XXXXX   XXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX...XXXXX...XXXXX...XXX",
+"X..XXX..X..XXX..X..XXX..X",
+"X.X...X.X.X...X.X.X...X.X",
+".X..X..X.X..X..X.X..X..X.",
+".X.X.X.X.X.X.X.X.X.X.X.X.",
+".X..X..X.X..X..X.X..X..X.",
+"X.X...X.X.X...X.X.X...X.X",
+"X..XXX..X..XXX..X..XXX..X",
+"XXX...XXXXX...XXXXX...XXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX   XXXXX   XXXXX   XXX",
+"X  XXX  X  XXX  X  XXX  X",
+"X X   X X X   X X X   X X",
+" X  X  X X  X  X X  X  X ",
+" X X X X X X X X X X X X ",
+" X  X  X X  X  X X  X  X ",
+"X X   X X X   X X X   X X",
+"X  XXX  X  XXX  X  XXX  X",
+"XXX   XXXXX   XXXXX   XXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_41[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #000000",
+". c #EAEAEA",
+/* pixels */
+".........................",
+".........................",
+".........................",
+"...........   ...........",
+"............   ..........",
+"............   ..........",
+"............  ...........",
+"............  .  ........",
+"............      .......",
+".......           .......",
+".........     ...........",
+"............  .   .......",
+"...........        ......",
+"......  .           .....",
+"......    ..  ....   ....",
+"......   ..      .   ....",
+"......               ....",
+".......   ..  ...   .....",
+"........           ......",
+".........  .  ..  .......",
+"..........      .........",
+".........     .  ........",
+"........   .  ..  .......",
+".......   ..  ..   ......",
+"......   ...  ...   .....",
+".....     ..  ...     ...",
+"...  ....     ....     ..",
+"..........    ...........",
+"...........   ...........",
+"............  ...........",
+"............ ............",
+".........................",
+".........................",
+".........................",
+"........................."
+};
+/* XPM */
+static char *pm_42[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #000000",
+". c #EAEAEA",
+/* pixels */
+".........................",
+".........................",
+".........................",
+".........  ..............",
+"..........    ...........",
+"...........     .........",
+"............   ..........",
+"............   ..........",
+"............  ...........",
+"............  . .........",
+"............     ........",
+"...........       .......",
+"........   .    .........",
+"............  .  ........",
+"............ ..   .......",
+"....... ....      .......",
+".......   .           ...",
+"........      .  ..    ..",
+".......     ..   ...   ..",
+".. ...     .    ....   ..",
+"... . ...     ..  ..  ...",
+"...  ...   .       .  ...",
+"....  ....     .....  ...",
+"....   .   .  ......  ...",
+".....   .... ......   ...",
+"......  .....         ...",
+"....... ........      ...",
+"...................  ....",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+"........................."
+};
+/* XPM */
+static char *pm_43[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #000000",
+". c #EAEAEA",
+/* pixels */
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".................  ......",
+"................    .....",
+"............          ...",
+".......      .....     ..",
+"..      .....   .      ..",
+"...  .........    .......",
+"..............   ........",
+"......  .....   .........",
+".......  ....   .........",
+".......  ... .  .........",
+"........  ..      .......",
+".......         .   .....",
+"......    . ..  ..   ....",
+"...    .  . ..  ...   ...",
+"...   ...   .. ....   ...",
+"...   ...   .  ...    ...",
+"....   ...           ....",
+".....               .....",
+"......     ....    ......",
+".......  ......   .......",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+"........................."
+};
+/* XPM */
+static char *pm_44[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #000000",
+". c #EAEAEA",
+/* pixels */
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".............   .........",
+".............     .......",
+"..............    .......",
+"......... ....    .......",
+".......    ...   ........",
+".......     ..  ..   ....",
+"........    ..  ..    ...",
+".........  ...  .      ..",
+"...     .  ...       ....",
+"...     .  ...    .......",
+"....   ..  ...  .........",
+".........  ...  .........",
+".........  . .  .........",
+"... .....   ..   ........",
+"...  ...   ...         ..",
+"...        ....        ..",
+"..      . .......     ...",
+"...   ... ...............",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+".........................",
+"........................."
+};
+/* XPM */
+static char *pm_51[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #B00000",
+". c #EAEAEA",
+/* pixels */
+".........................",
+".........................",
+".........................",
+".........................",
+"............ ............",
+"..........    ...........",
+"...........    ..........",
+"............  ...........",
+"............  ...........",
+"............  ...........",
+"............  ....  .....",
+"..  .......           ...",
+"...  ....     .....    ..",
+"....  .  ...  .....    ..",
+"....    ....  .....    ..",
+".....   ....  ....     ..",
+".....    ...  ...   . ...",
+"......              .....",
+"......   ...  ..   ......",
+".......  ...  ... .......",
+"............  ...........",
+"............  ...........",
+"............  ...........",
+"............  ...........",
+"............  ...........",
+"............  ...........",
+"............  ...........",
+"............  ...........",
+"............  ...........",
+"............  ...........",
+"............ ............",
+"............ ............",
+".........................",
+".........................",
+"........................."
+};
+/* XPM */
+static char *pm_52[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #EAEAEA",
+". c #002060",
+/* pixels */
+"                         ",
+"                         ",
+"  ...................... ",
+"  .                    . ",
+"  . .................. . ",
+"  . . .            . . . ",
+"  . ..              .. . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . .                . . ",
+"  . ..              .. . ",
+"  . . .            . . . ",
+"  . .................. . ",
+"  .                    . ",
+"  ...................... ",
+"                         ",
+"                         "
+};
+/* XPM */
+static char *pm_53[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 2 1",
+/* colors */
+"  c #EAEAEA",
+". c #063A30",
+/* pixels */
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"              ..         ",
+"               ...       ",
+"                ...      ",
+"           .    ..       ",
+"           ..   .        ",
+"        .  ... . .       ",
+"        ..... .  ..      ",
+"        . .....  ...     ",
+"    .. . ...  .. ..      ",
+"     ..  ... . ...       ",
+"     .. ... .. ..        ",
+"    . . .. .......       ",
+"       .. .. .. ...      ",
+"       . .. ........     ",
+"      . .. .. .. ....    ",
+"     . ....  .... ....   ",
+"    . .. ... ..........  ",
+"   . ..  ...... .... ... ",
+"  . ... .............    ",
+" . ...  ... .... ....    ",
+"    .. ...........  .    ",
+"     .... . ..  ...      ",
+"      ..   ..   ....     ",
+"          .      ...     ",
+"                 ...     ",
+"                 ..      ",
+"                         ",
+"                         ",
+"                         ",
+"                         ",
+"                         "
+};
+/* XPM */
+static char *pm_61[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 4 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+"o c #063A30",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"...XXXXXXXXXXXXX XXXXXXXX",
+"XX.XXXXXooXXXXXX  XX    X",
+"XX.XXXXoooooXXXX XXXXXXXX",
+"XX.XXXooooXoXXXX XXX   XX",
+"X...XXooooXoXXX  X X XXXX",
+"XXXXXXXXooXXXXX          ",
+"XXXXXooooXXXXXXX X X XXXX",
+"XXXXXoXXooooXXXX XXX   XX",
+"XXXXXXooooXXoXXX XXX X XX",
+"XXXXXXXooXXXoXXXXXXXX XXX",
+"XXXXoXXoXXXXXXXXXXXXXXXXX",
+"XXXoXoooXXXXXXXXXXXXXXXXX",
+"XXXooXooooooXXXXXXoXXXXXX",
+"XXXXXooXXXXXXXXXXXXoXXXXX",
+"XXXXXXXX....XXXXXXoXXXXXX",
+"XXXXXXX..XX..XXXXooXXXXXX",
+"XXXXX....XX.....oXooXXXXX",
+"XXXX.............XoXoXXXX",
+"XXX..XX....X.XX..XoXoXXXX",
+"XXXX.XX..XXX....XXXoXXXXX",
+"XXXX......XX....XXoXXXXXX",
+"XXXXX......X...XXXoXXXXXX",
+"XXXooX..XX...X.XXXoXXXXXX",
+"XooooX..XX..XX.XXooXXXXXX",
+"oooooX.........XXooXXXXXX",
+"XooooXXXXXXXXXXXXooXXXXXX",
+"XooooXXooooooooXXooXXXXXX",
+"XXoooooooXXXXooooooXXXXXX",
+"XooXooXXXXXXXXXoooooXXXXX",
+"XXXXXoXXXXXXXXXXXooooXXXX",
+"XXXXXXXXXXXXXXXXXXXoooooX",
+"XXXXXXXXXXXXXXXXXXXXooooX",
+"XXXXXXXXXXXXXXXXXXXXXXooX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_62[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 4 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+"o c #063A30",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXX XX",
+"XX....XXXXoXXXXXXXXX   XX",
+"XX.XX.XXXXXoXXXXXX   XX X",
+"XXXX..XXXXXoXXXXXX XXXX X",
+"XXX..XXXXXXXoXXXXX XXX XX",
+"XX..XXXXXXXXoXXXX        ",
+"XX....XXXXXXoXXXXXX  XXXX",
+"XXXXXXXXXXXXoXXXXX  XXXXX",
+"XXXXXXXXXXXXoXXoX X XXXXX",
+"XXXXXXXXXXXXooXXX X  XXXX",
+"XXXXXXXXXXXXoXXXXX XXXXXX",
+"XXXXXXXXXXXooXXXXXXXXXXXX",
+"XXXoXXXXXXXoXXXXXXooooooX",
+"XXoXXXXXXoXoXXoooooXoXXoX",
+"XooXXXXXXXoXXoXXXXXXXXXoo",
+"XoXXXoooXXooooXXXXXXXXXoo",
+"ooXXXXXoXXoooXXXXXXXXXooX",
+"ooXXXXXoXooXXXXXXXXXXXoXX",
+"XXoXXXXoXoXXXXXXXXXXXXXXX",
+"XXXXooXoooXXXXXXXXXXoXXXX",
+"XXXXXooooXXXXXXXXoXXXXXXX",
+"XXXXXXXooXXXXXXXXoXoXXXXX",
+"XXXXXXXoooXXXXXXXXoXooXXX",
+"XXXXXXXoooXXXXXXXXooXXXXX",
+"XXXXXXXoXoXXoXXXXXoXXXXXX",
+"XXXXXXXoXoXooXXXXXoXXXXXX",
+"XXXXXXXoXoXoXXXXXXoXXXXXX",
+"XXXXXXXoooooXXXXXXoXXXXXX",
+"XXXXXXXXoooooXXXXXoXXXXXX",
+"XXXXXXXooooooXXXXooXXXXXX",
+"XXXXXXXXXXoooXXXXoXXXXXXX",
+"XXXXXXXXXXXoooXXooXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_63[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 4 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+"o c #063A30",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"X....XXXXXXXXXXXXXXXXX  X",
+"X.XX..XXXXXXXXXXXXXXXXXXX",
+"XXX...XXXXXXXXXXXXX      ",
+"XXX...XXXXXoXXoXXXXXXXXXX",
+"XXXXX.XXXXXooooXXXXX XXXX",
+"XX.X..XXXXXXooXXXX X XX X",
+"XXX..XXooooXoXXXXXXX XXXX",
+"XXXXXXXooooXoXXXXX      X",
+"XXXXXXXXoooooXXXXXXX XXXX",
+"XXXXXXXXXoooXXXXX  X XXXX",
+"XXXoooXXXXooXXXXXXXXXXXXX",
+"XXXooooXXXoXXXXXXXXXXXXXX",
+"XXXXXXoXX.....XXXXXXXXXXX",
+"XXXXXXo....X.....XXXXXXXX",
+"XXXXXX.....XX....XXXXXXXX",
+"XXXXXX..X..XX..X..XooXXXX",
+"XXXXX.........XX..oXXXXXX",
+"oooXX............XoooXXXX",
+"oooXX.XX.........XXXXXXXX",
+"ooXXX....X....XX..XXXXXXX",
+"XXXXX..........XX.XXXXXXX",
+"XXXXX..XX.........XXXXXXX",
+"XXXXX.XXX........XXXooXXX",
+"XXXXX.....XX..XXXXXoooXXX",
+"XXXXXX....XX.XXXXXooXXXXX",
+"XoXXXXXX.....XXXXXoXXXXXX",
+"ooooooooX...XXXXXoXXXXXXX",
+"oooXXXXoooXXXXXXXoXXXXXXX",
+"XXXXXXXooooooXXXXooooooXX",
+"XXXXXoooXXXooooooooooooXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_64[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 4 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+"o c #063A30",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX.XXXXXXXXXXXXXXXXXXXXX",
+"XX..XXXXXXXXXXXXXXXXXXXXX",
+"X...XXXXXXXXoXXXX X  XXXX",
+"X.X.XXXXXXXoXXX       XXX",
+"X....XXXXXoXXXXXX  X XXXX",
+"XXX.XXXXXXoXXXXXX  X XXXX",
+"XXXXXXXXXXoXXXXXX XXX XXX",
+"XXXXXXXXXXoXXXXX  XXX XXX",
+"XXXXXXXXXXooXXXX XXXX XXX",
+"XXXXXXXXXXooXXXX XXX  XXX",
+"XXXXXXXXXXooXXXXXoXXXXXXX",
+"XXXXooXXXXoooXXXXoXXXXXXX",
+"XXXoooXoXXXooXXXooXXXXXXX",
+"XXXoXXXXoXXXoXXXXXXXXXoXX",
+"XXoooXXXXoXXooXXXXXXooooX",
+"XXXXXXXXXXoXXoXXooooooXXX",
+"XXXXXXXXXXoXoooooXoXXooXX",
+"XXXXXXooooooXooXoXXoXXooX",
+"XXXXoooXoooXXXoXooXXXoXoX",
+"XXXooXoooooXXXooXXXXXoXoX",
+"XXoooXoooXoooooXXoooXXooX",
+"XoXXoXooXXooXXooooXooXXoX",
+"XoXXXXoXXXoXXXooXXXXXoooX",
+"XoXoXXooXXooooooXXXXXXooX",
+"XoooXXooXXXooXooXXXXXXoXX",
+"XXoooXooXXXoXXXoXXXoXXXXX",
+"XXoXXXXoXXXoXXXooXooXXXXX",
+"XXXXXoooXXXooooooooXXooXX",
+"XXXXXXXooXXooXXXooXXoXXXX",
+"XXXXXXXXoXXoXXXXooXoXXXoX",
+"XXXXXXXXooXooooooooXXXoXX",
+"XXXXXoXXXoooXXXXXXXXXoXXX",
+"XXXXXXXXXXoXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_71[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 4 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+"o c #063A30",
+/* pixels */
+"XXXXXX.XXXXXXXXXXXXXXXXXX",
+"XXX....XXXXXXXXXXXXXXXXXX",
+"XXXX.X...XXXXXXXXXXXXXXXX",
+"XXXX.X.XXXXXXXXXXXoXXXX X",
+"XXXX.X.....XXXXXXXoXXX  X",
+"XXX......XXXXXXXoooXoX  X",
+"X....XXX.XXXXXXXXooooXX X",
+"XXX.......XXXXXXXoooXXX X",
+"XX...XX..X..XXXXXooXXXX  ",
+"X..X.....XXXXXXXXoXXXXXXX",
+"XXXX.XX..XXXXXXoooooXXXXX",
+"XXXX....XXXXXXXooooooXXXX",
+"XXXXXXXXXXXXXXXooXoooXXXX",
+"XXXXXXXXXXXXXXXooooXXXXXX",
+"XXXXXXXXXXXXXXoooXXXooooX",
+"XXXooooXXXXXXXXXXXooXXXoX",
+"XXooXXooXXX.....XXoooXooX",
+"XXooooooXX..XXX..XoXoooXX",
+"XXXXXoX....XXXX..XXXXXXXX",
+"XXXXXX..XX..XX.....XXXXXX",
+"XXXXXX.XXX......XX.XXXXXX",
+"XXXXXX.XXXX.XX.XXX..XXXXX",
+"XXXXXXX.XXX....XXX..XXXXX",
+"XXXXXXX.XX......X..XXXXXX",
+"XXXXXXX.....XX....XXoooXX",
+"XXXXXXXXXXX.XXX..XXooXooX",
+"XXXXXXXXXXX.XXX.XoXoXXooX",
+"XXXXXXXXXXX....XXoXoXXoXX",
+"XXoooooooooooXoXXoooooXXX",
+"XooooXXoooooooooXXooooXXX",
+"ooooXXXXooXoooooooXoooXXX",
+"oXoXXXXooooXXooooooooooXX",
+"oooXXXXoooXXXXXXXXoXooooX",
+"ooXXXXXXoXXXXXXXXXXXXXooX",
+"XXXXXXXXXXXXXXXXXXXXXXXoX"
+};
+/* XPM */
+static char *pm_72[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 4 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+"o c #063A30",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXX.XXXXXXXXXXXXX  XX",
+"X.......XXXoXXXXXXX  X XX",
+"XXXX..XXXXXooXXXXXX XX XX",
+"XXX.....XXXXoXXXooXXX XXX",
+"XXX.XXX.XXXXooXXoXXX XXXX",
+"XXX.....XXXXXoXXoXX    XX",
+"XX....X.XXXXXoXoooXXXXXXX",
+"X..XX...XXXXXoXoooXXXXXXX",
+"XXXXX..XXXXXXooXXoXXXXXXX",
+"XX.......XXXXooooXXXXXXXX",
+"XXXXXXXXXXXXXoooXXXXXoooX",
+"XXoooXXXooXXXooXXXXXoooXX",
+"XXXXooXooXXXXooXXXXoooooX",
+"XXXXXoooXXXXXXXXXXooXXXXX",
+"XXXXXooXXXXX..XXXXoXXXXXX",
+"XXXXXooXXX.....XXXoooXXXX",
+"XXXXXXoXX...XX..XooXXXXXX",
+"XXXXXXoXX.X..XX.XoXXXXXXX",
+"XXXXXXoXX.XX.XX..XXXXXXXX",
+"XXXXXXoX...X..XX.XXXXXXXX",
+"XooXXXXX.X.....X.XXXXXXXX",
+"XXooXXXX.XX....X.XXXXXXXX",
+"XXXXoXXX.XX..X....XXXXXXX",
+"XXXXooXo....XX....XooXXXX",
+"XXXXXoooXX..XXX..XooXXXXX",
+"XXXXXooXXXX.....XXoXXXXXX",
+"XXooXXooXXoooXXXXXXXXXXXX",
+"XXXoXXXooXXXooooooXXXXXXX",
+"XXXXoXXXoXXXXXXXXXXXXXXXX",
+"XXXXXoXXooXXXooXXXXXXXXXX",
+"XXXXXXoXooooooooooXXXXXXX",
+"XXXXXXooooXXXXXXooXXXXXXX",
+"XXXXXXXXXXXXXXXXXoXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_73[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 4 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+"o c #063A30",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXX.XXXX.XXXXXXXoXXXX   X",
+"XXX..XXX.XXXXXXXooXXXXX X",
+"XXX...XX....XXXXXooXXXX X",
+"X...XX...XXXXXXoooooX   X",
+"XXX..XXX.XXXXXXoXXoXXXXX ",
+"XXX...X...XXXXXooXoXX  X ",
+"X...XX.XX..XXXXXoooXXX  X",
+"XXX...XXXX..XXXXoooXXXXXX",
+"XXX..XXXXXX..XXXXooXXXXXX",
+"XXX.XXXXXXXXXXXXXooXXXXXX",
+"XXXXXXXXXXXXXXXXXooXXXXXX",
+"XoooooXXXXXoooooooooXXXXX",
+"oooXXoXXXXXXoXXooXXoXXXXX",
+"XoooooXXXXXXooXooXXoXXXXX",
+"XXXXXXXXX..XXoooooooXXXXX",
+"XXXXXX...X..XXXoXXXoXXXXX",
+"XXXXX..XXXX..XXXXooooXXXX",
+"XXXXX.XXXXXX.XXXooXXoXXXX",
+"XXXX.....XXX..XXoooooXXXX",
+"XXX..X.....XX..XXXooXXXXX",
+"XXX..X..XX.XXX.XXXXXXXXXX",
+"XXX......XX.XX.XXXXXXXXXX",
+"XXX.X.XX..X.XX.XXXXXXXXXX",
+"XXX.X..X..X.XX.XXXXXoooXX",
+"XXX............XXXXooXoXX",
+"XXXX....X....XXXoXoXXooXX",
+"XXXXX.......XXXooooXooXXX",
+"ooooooooooXXXXXXoooooXXXX",
+"oXXooXooooooooooooooXXXXX",
+"XXooXXoXXooXXXXXoooooXXXX",
+"ooXXXXoXooXXXXXXXXoooooXX",
+"XXXXXXoooXXXXXXXXXXXooooo",
+"XXXXXXXoXXXXXXXXXXXXXXXXo",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_74[] = {
+/* width height ncolors chars_per_pixel */
+"25 35 4 1",
+/* colors */
+"  c #000000",
+". c #B00000",
+"X c #EAEAEA",
+"o c #063A30",
+/* pixels */
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXX...XXXXXXXXXXXXX XX",
+"XXX......XXXoXXXXXXXX  XX",
+"XXXX..X.XXXXoXXXXXXXX  XX",
+"XXXXX...XXXXooXXXXXX X XX",
+"XXXX....XXXXooXXXXXX     ",
+"XX..XXX..XXXooXXXXXX    X",
+"X..XXXXX..XoXoXXXXXXXXX X",
+"X.XXX...XX.oooXXXXXXXXXXX",
+"XXXXXXXXXXXXooXXXXXooooXX",
+"XXXX....XXXXoXXXXXooXXooX",
+"XXXXXXXXXXXoooooXooXXXXoX",
+"XXXXXXXXXXXoooXXXoooooooX",
+"XXXXXXoooXooXXXXXooXXXXXX",
+"XXXXXooXoooXXXXXooooXXXXX",
+"XXXXXooooooXXXXXooXooXXXX",
+"XXXXXoXXooXXXXXXoXXoXXXXX",
+"XXXXXXXXoX......ooooXXXXX",
+"XXXXXXXXXX.XXXX.XXXXXXXXX",
+"XXXXXXX....XXX....XXXXXXX",
+"XXXXXX..X....X.....XXXXXX",
+"XXXXXX..XX.....XXX.XXXXXX",
+"XXXXXXX.XX.XX..XXX.XXXXXX",
+"XXXXXXX....X...XXX.XXXXXX",
+"XXXXXXXXX...X..XX..XXXXXX",
+"XXXXXooXX.XXX.....XXXXXXX",
+"XXooooooX.XXX.XXXXXooXXXX",
+"XXoXXXXoo.....XXooooooXXX",
+"XXoooXXXooXXXXXXoXXXXooXX",
+"XXXXooooooXoooXooXXXXXooX",
+"XXXXXXXXooooXoooooooXXXoX",
+"XXXXXXXXXooXXoooXXXoooooX",
+"XXXXXXXXXooXXXoXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXXXXXXXXXXX"
+};
+/* XPM */
+static char *pm_101[] = {
+/* width height ncolors chars_per_pixel */
+"35 35 3 1",
+/* colors */
+"  c #000000",
+". c None",
+"X c #FFFFFF",
+/* pixels */
+".............         .............",
+"..........   XXXXXXXXX   ..........",
+"........  XXXXXXXXXXXXXXX  ........",
+"....... XXXXXXXX   XXXXXXXX .......",
+"...... XXXXXXXXXX   XXXXXXXX ......",
+"..... XXXXXXXXXXX   XXXXXXXXX .....",
+".... XXXXXXXXXXXX  XXXXXXXXXXX ....",
+"... XXXXXXXXXXXXX  X  XXXXXXXXX ...",
+".. XXXXXXXXXXXXXX      XXXXXXXXX ..",
+".. XXXXXXXXX           XXXXXXXXX ..",
+". XXXXXXXXXXXX     XXXXXXXXXXXXXX .",
+". XXXXXXXXXXXXXXX  X   XXXXXXXXXX .",
+". XXXXXXXXXXXXXX        XXXXXXXXX .",
+" XXXXXXXXXX  X           XXXXXXXXX ",
+" XXXXXXXXXX    XX  XXXX   XXXXXXXX ",
+" XXXXXXXXXX   XX      X   XXXXXXXX ",
+" XXXXXXXXXX               XXXXXXXX ",
+" XXXXXXXXXXX   XX  XXX   XXXXXXXXX ",
+" XXXXXXXXXXXX           XXXXXXXXXX ",
+" XXXXXXXXXXXXX  X  XX  XXXXXXXXXXX ",
+" XXXXXXXXXXXXXX      XXXXXXXXXXXXX ",
+" XXXXXXXXXXXXX     X  XXXXXXXXXXXX ",
+". XXXXXXXXXXX   X  XX  XXXXXXXXXX .",
+". XXXXXXXXXX   XX  XX   XXXXXXXXX .",
+". XXXXXXXXX   XXX  XXX   XXXXXXXX .",
+".. XXXXXXX     XX  XXX     XXXXX ..",
+".. XXXXX  XXXX     XXXX     XXXX ..",
+"... XXXXXXXXXXX    XXXXXXXXXXXX ...",
+".... XXXXXXXXXXX   XXXXXXXXXXX ....",
+"..... XXXXXXXXXXX  XXXXXXXXXX .....",
+"...... XXXXXXXXXX XXXXXXXXXX ......",
+"....... XXXXXXXXXXXXXXXXXXX .......",
+"........  XXXXXXXXXXXXXXX  ........",
+"..........   XXXXXXXXX   ..........",
+".............         ............."
+};
+/* XPM */
+static char *pm_102[] = {
+/* width height ncolors chars_per_pixel */
+"35 35 3 1",
+/* colors */
+"  c #000000",
+". c None",
+"X c #FFFFFF",
+/* pixels */
+".............         .............",
+"..........   XXXXXXXXX   ..........",
+"........  XXXXXXXXXXXXXXX  ........",
+"....... XXXXXX  XXXXXXXXXXX .......",
+"...... XXXXXXXX    XXXXXXXXX ......",
+"..... XXXXXXXXXX     XXXXXXXX .....",
+".... XXXXXXXXXXXX   XXXXXXXXXX ....",
+"... XXXXXXXXXXXXX   XXXXXXXXXXX ...",
+".. XXXXXXXXXXXXXX  XXXXXXXXXXXXX ..",
+".. XXXXXXXXXXXXXX  X XXXXXXXXXXX ..",
+". XXXXXXXXXXXXXXX     XXXXXXXXXXX .",
+". XXXXXXXXXXXXXX       XXXXXXXXXX .",
+". XXXXXXXXXXX   X    XXXXXXXXXXXX .",
+" XXXXXXXXXXXXXXXX  X  XXXXXXXXXXXX ",
+" XXXXXXXXXXXXXXXX XX   XXXXXXXXXXX ",
+" XXXXXXXXXXX XXXX      XXXXXXXXXXX ",
+" XXXXXXXXXXX   X           XXXXXXX ",
+" XXXXXXXXXXXX      X  XX    XXXXXX ",
+" XXXXXXXXXXX     XX   XXX   XXXXXX ",
+" XXXXXX XXX     X    XXXX   XXXXXX ",
+" XXXXXXX X XXX     XX  XX  XXXXXXX ",
+" XXXXXXX  XXX   X       X  XXXXXXX ",
+". XXXXXXX  XXXX     XXXXX  XXXXXX .",
+". XXXXXXX   X   X  XXXXXX  XXXXXX .",
+". XXXXXXXX   XXXX XXXXXX   XXXXXX .",
+".. XXXXXXXX  XXXXX         XXXXX ..",
+".. XXXXXXXXX XXXXXXXX      XXXXX ..",
+"... XXXXXXXXXXXXXXXXXXXX  XXXXX ...",
+".... XXXXXXXXXXXXXXXXXXXXXXXXX ....",
+"..... XXXXXXXXXXXXXXXXXXXXXXX .....",
+"...... XXXXXXXXXXXXXXXXXXXXX ......",
+"....... XXXXXXXXXXXXXXXXXXX .......",
+"........  XXXXXXXXXXXXXXX  ........",
+"..........   XXXXXXXXX   ..........",
+".............         ............."
+};
+/* XPM */
+static char *pm_103[] = {
+/* width height ncolors chars_per_pixel */
+"35 35 3 1",
+/* colors */
+"  c #000000",
+". c None",
+"X c #FFFFFF",
+/* pixels */
+".............         .............",
+"..........   XXXXXXXXX   ..........",
+"........  XXXXXXXXXXXXXXX  ........",
+"....... XXXXXXXXXXXXXXXXXXX .......",
+"...... XXXXXXXXXXXXXXXXXXXXX ......",
+"..... XXXXXXXXXXXXXXXXXXXXXXX .....",
+".... XXXXXXXXXXXXXXXXXXXXXXXXX ....",
+"... XXXXXXXXXXXXXXXXXX  XXXXXXX ...",
+".. XXXXXXXXXXXXXXXXXX    XXXXXXX ..",
+".. XXXXXXXXXXXXXX          XXXXX ..",
+". XXXXXXXXXX      XXXXX     XXXXX .",
+". XXXXX      XXXXX   X      XXXXX .",
+". XXXXXX  XXXXXXXXX    XXXXXXXXXX .",
+" XXXXXXXXXXXXXXXXXX   XXXXXXXXXXXX ",
+" XXXXXXXXXX  XXXXX   XXXXXXXXXXXXX ",
+" XXXXXXXXXXX  XXXX   XXXXXXXXXXXXX ",
+" XXXXXXXXXXX  XXX X  XXXXXXXXXXXXX ",
+" XXXXXXXXXXXX  XX      XXXXXXXXXXX ",
+" XXXXXXXXXXX         X   XXXXXXXXX ",
+" XXXXXXXXXX    X XX  XX   XXXXXXXX ",
+" XXXXXXX    X  X XX  XXX   XXXXXXX ",
+" XXXXXXX   XXX   XX XXXX   XXXXXXX ",
+". XXXXXX   XXX   X  XXX    XXXXXX .",
+". XXXXXXX   XXX           XXXXXXX .",
+". XXXXXXXX               XXXXXXXX .",
+".. XXXXXXXX     XXXX    XXXXXXXX ..",
+".. XXXXXXXXX  XXXXXX   XXXXXXXXX ..",
+"... XXXXXXXXXXXXXXXXXXXXXXXXXXX ...",
+".... XXXXXXXXXXXXXXXXXXXXXXXXX ....",
+"..... XXXXXXXXXXXXXXXXXXXXXXX .....",
+"...... XXXXXXXXXXXXXXXXXXXXX ......",
+"....... XXXXXXXXXXXXXXXXXXX .......",
+"........  XXXXXXXXXXXXXXX  ........",
+"..........   XXXXXXXXX   ..........",
+".............         ............."
+};
+/* XPM */
+static char *pm_104[] = {
+/* width height ncolors chars_per_pixel */
+"35 35 3 1",
+/* colors */
+"  c #000000",
+". c None",
+"X c #FFFFFF",
+/* pixels */
+".............         .............",
+"..........   XXXXXXXXX   ..........",
+"........  XXXXXXXXXXXXXXX  ........",
+"....... XXXXXXXXXXXXXXXXXXX .......",
+"...... XXXXXXXXXXXXXXXXXXXXX ......",
+"..... XXXXXXXXXXXXXXXXXXXXXXX .....",
+".... XXXXXXXXXXXXXXXXXXXXXXXXX ....",
+"... XXXXXXXXXXXXXXXXXXXXXXXXXXX ...",
+".. XXXXXXXXXXXXXXXXXXXXXXXXXXXXX ..",
+".. XXXXXXXXXXXXXXX   XXXXXXXXXXX ..",
+". XXXXXXXXXXXXXXXX     XXXXXXXXXX .",
+". XXXXXXXXXXXXXXXXX    XXXXXXXXXX .",
+". XXXXXXXXXXXX XXXX    XXXXXXXXXX .",
+" XXXXXXXXXXX    XXX   XXXXXXXXXXXX ",
+" XXXXXXXXXXX     XX  XX   XXXXXXXX ",
+" XXXXXXXXXXXX    XX  XX    XXXXXXX ",
+" XXXXXXXXXXXXX  XXX  X      XXXXXX ",
+" XXXXXXX     X  XXX       XXXXXXXX ",
+" XXXXXXX     X  XXX    XXXXXXXXXXX ",
+" XXXXXXXX   XX  XXX  XXXXXXXXXXXXX ",
+" XXXXXXXXXXXXX  XXX  XXXXXXXXXXXXX ",
+" XXXXXXXXXXXXX  X X  XXXXXXXXXXXXX ",
+". XXXXXX XXXXX   XX   XXXXXXXXXXX .",
+". XXXXXX  XXX   XXX         XXXXX .",
+". XXXXXX        XXXX        XXXXX .",
+".. XXXX      X XXXXXXX     XXXXX ..",
+".. XXXXX   XXX XXXXXXXXXXXXXXXXX ..",
+"... XXXXXXXXXXXXXXXXXXXXXXXXXXX ...",
+".... XXXXXXXXXXXXXXXXXXXXXXXXX ....",
+"..... XXXXXXXXXXXXXXXXXXXXXXX .....",
+"...... XXXXXXXXXXXXXXXXXXXXX ......",
+"....... XXXXXXXXXXXXXXXXXXX .......",
+"........  XXXXXXXXXXXXXXX  ........",
+"..........   XXXXXXXXX   ..........",
+".............         ............."
+};
+char **fallbackpixmaps[] = {
+pm_0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pm_11, pm_12, pm_13, pm_14, pm_15, pm_16, pm_17, pm_18, pm_19, 0, pm_21, pm_22, pm_23, pm_24, pm_25, pm_26, pm_27, pm_28, pm_29, 0, pm_31, pm_32, pm_33, pm_34, pm_35, pm_36, pm_37, pm_38, pm_39, 0, pm_41, pm_42, pm_43, pm_44, 0, 0, 0, 0, 0, 0, pm_51, pm_52, pm_53, 0, 0, 0, 0, 0, 0, 0, pm_61, pm_62, pm_63, pm_64, 0, 0, 0, 0, 0, 0, pm_71, pm_72, pm_73, pm_74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, pm_99, 0, pm_101, pm_102, pm_103, pm_104, 
+};
--- /dev/null
+++ b/game-enums.c
@@ -0,0 +1,116 @@
+char *game_print_GameState(const GameState t) {
+  if ( t == HandComplete ) return "HandComplete";
+  if ( t == Dealing ) return "Dealing";
+  if ( t == DeclaringSpecials ) return "DeclaringSpecials";
+  if ( t == Discarding ) return "Discarding";
+  if ( t == Discarded ) return "Discarded";
+  if ( t == MahJonging ) return "MahJonging";
+  return (char *)0;
+}
+
+GameState game_scan_GameState(const char *s) {
+  if ( strcmp(s,"HandComplete") == 0 ) return HandComplete;
+  if ( strcmp(s,"Dealing") == 0 ) return Dealing;
+  if ( strcmp(s,"DeclaringSpecials") == 0 ) return DeclaringSpecials;
+  if ( strcmp(s,"Discarding") == 0 ) return Discarding;
+  if ( strcmp(s,"Discarded") == 0 ) return Discarded;
+  if ( strcmp(s,"MahJonging") == 0 ) return MahJonging;
+  return -1;
+}
+
+
+char *game_print_seats(const seats t) {
+  if ( t == east ) return "east";
+  if ( t == south ) return "south";
+  if ( t == west ) return "west";
+  if ( t == north ) return "north";
+  if ( t == noseat ) return "noseat";
+  return (char *)0;
+}
+
+seats game_scan_seats(const char *s) {
+  if ( strcmp(s,"east") == 0 ) return east;
+  if ( strcmp(s,"south") == 0 ) return south;
+  if ( strcmp(s,"west") == 0 ) return west;
+  if ( strcmp(s,"north") == 0 ) return north;
+  if ( strcmp(s,"noseat") == 0 ) return noseat;
+  return -1;
+}
+
+
+char *game_print_Whence(const Whence t) {
+  if ( t == FromNone ) return "FromNone";
+  if ( t == FromWall ) return "FromWall";
+  if ( t == FromDiscard ) return "FromDiscard";
+  if ( t == FromLoose ) return "FromLoose";
+  if ( t == FromRobbedKong ) return "FromRobbedKong";
+  return (char *)0;
+}
+
+Whence game_scan_Whence(const char *s) {
+  if ( strcmp(s,"FromNone") == 0 ) return FromNone;
+  if ( strcmp(s,"FromWall") == 0 ) return FromWall;
+  if ( strcmp(s,"FromDiscard") == 0 ) return FromDiscard;
+  if ( strcmp(s,"FromLoose") == 0 ) return FromLoose;
+  if ( strcmp(s,"FromRobbedKong") == 0 ) return FromRobbedKong;
+  return -1;
+}
+
+
+char *game_print_Konging(const Konging t) {
+  if ( t == NotKonging ) return "NotKonging";
+  if ( t == AddingToPung ) return "AddingToPung";
+  if ( t == DeclaringKong ) return "DeclaringKong";
+  return (char *)0;
+}
+
+Konging game_scan_Konging(const char *s) {
+  if ( strcmp(s,"NotKonging") == 0 ) return NotKonging;
+  if ( strcmp(s,"AddingToPung") == 0 ) return AddingToPung;
+  if ( strcmp(s,"DeclaringKong") == 0 ) return DeclaringKong;
+  return -1;
+}
+
+
+char *game_print_Claims(const Claims t) {
+  if ( t == UnknownClaim ) return "UnknownClaim";
+  if ( t == NoClaim ) return "NoClaim";
+  if ( t == ChowClaim ) return "ChowClaim";
+  if ( t == PungClaim ) return "PungClaim";
+  if ( t == KongClaim ) return "KongClaim";
+  if ( t == MahJongClaim ) return "MahJongClaim";
+  if ( t == PairClaim ) return "PairClaim";
+  if ( t == SpecialSetClaim ) return "SpecialSetClaim";
+  return (char *)0;
+}
+
+Claims game_scan_Claims(const char *s) {
+  if ( strcmp(s,"UnknownClaim") == 0 ) return UnknownClaim;
+  if ( strcmp(s,"NoClaim") == 0 ) return NoClaim;
+  if ( strcmp(s,"ChowClaim") == 0 ) return ChowClaim;
+  if ( strcmp(s,"PungClaim") == 0 ) return PungClaim;
+  if ( strcmp(s,"KongClaim") == 0 ) return KongClaim;
+  if ( strcmp(s,"MahJongClaim") == 0 ) return MahJongClaim;
+  if ( strcmp(s,"PairClaim") == 0 ) return PairClaim;
+  if ( strcmp(s,"SpecialSetClaim") == 0 ) return SpecialSetClaim;
+  return -1;
+}
+
+
+char *game_print_GameFlags(const GameFlags t) {
+  if ( t == GFKong ) return "GFKong";
+  if ( t == GFKongUponKong ) return "GFKongUponKong";
+  if ( t == GFDangerousDiscard ) return "GFDangerousDiscard";
+  if ( t == GFNoChoice ) return "GFNoChoice";
+  return (char *)0;
+}
+
+GameFlags game_scan_GameFlags(const char *s) {
+  if ( strcmp(s,"GFKong") == 0 ) return GFKong;
+  if ( strcmp(s,"GFKongUponKong") == 0 ) return GFKongUponKong;
+  if ( strcmp(s,"GFDangerousDiscard") == 0 ) return GFDangerousDiscard;
+  if ( strcmp(s,"GFNoChoice") == 0 ) return GFNoChoice;
+  return -1;
+}
+
+
--- /dev/null
+++ b/game-enums.h
@@ -0,0 +1,18 @@
+char *game_print_GameState(const GameState t);
+GameState game_scan_GameState(const char *s);
+
+char *game_print_seats(const seats t);
+seats game_scan_seats(const char *s);
+
+char *game_print_Whence(const Whence t);
+Whence game_scan_Whence(const char *s);
+
+char *game_print_Konging(const Konging t);
+Konging game_scan_Konging(const char *s);
+
+char *game_print_Claims(const Claims t);
+Claims game_scan_Claims(const char *s);
+
+char *game_print_GameFlags(const GameFlags t);
+GameFlags game_scan_GameFlags(const char *s);
+
--- /dev/null
+++ b/player-enums.c
@@ -0,0 +1,122 @@
+char *player_print_TileSetType(const TileSetType t) {
+  if ( t == Empty ) return "Empty";
+  if ( t == Chow ) return "Chow";
+  if ( t == Pung ) return "Pung";
+  if ( t == Kong ) return "Kong";
+  if ( t == ClosedPung ) return "ClosedPung";
+  if ( t == ClosedKong ) return "ClosedKong";
+  if ( t == ClosedChow ) return "ClosedChow";
+  if ( t == Pair ) return "Pair";
+  if ( t == ClosedPair ) return "ClosedPair";
+  return (char *)0;
+}
+
+TileSetType player_scan_TileSetType(const char *s) {
+  if ( strcmp(s,"Empty") == 0 ) return Empty;
+  if ( strcmp(s,"Chow") == 0 ) return Chow;
+  if ( strcmp(s,"Pung") == 0 ) return Pung;
+  if ( strcmp(s,"Kong") == 0 ) return Kong;
+  if ( strcmp(s,"ClosedPung") == 0 ) return ClosedPung;
+  if ( strcmp(s,"ClosedKong") == 0 ) return ClosedKong;
+  if ( strcmp(s,"ClosedChow") == 0 ) return ClosedChow;
+  if ( strcmp(s,"Pair") == 0 ) return Pair;
+  if ( strcmp(s,"ClosedPair") == 0 ) return ClosedPair;
+  return -1;
+}
+
+
+char *player_print_PlayerOption(const PlayerOption t) {
+  if ( t == POUnknown ) return "Unknown";
+  if ( t == POInfoTiles ) return "InfoTiles";
+  if ( t == PODelayTime ) return "DelayTime";
+  if ( t == POLocalTimeouts ) return "LocalTimeouts";
+  if ( t == PONumOptions ) return "NumOptions";
+  return (char *)0;
+}
+
+PlayerOption player_scan_PlayerOption(const char *s) {
+  if ( strcmp(s,"Unknown") == 0 ) return POUnknown;
+  if ( strcmp(s,"InfoTiles") == 0 ) return POInfoTiles;
+  if ( strcmp(s,"DelayTime") == 0 ) return PODelayTime;
+  if ( strcmp(s,"LocalTimeouts") == 0 ) return POLocalTimeouts;
+  if ( strcmp(s,"NumOptions") == 0 ) return PONumOptions;
+  return -1;
+}
+
+
+char *player_print_PlayerFlags(const PlayerFlags t) {
+  if ( t == Hidden ) return "Hidden";
+  if ( t == MahJongged ) return "MahJongged";
+  if ( t == HandDeclared ) return "HandDeclared";
+  if ( t == NoDiscard ) return "NoDiscard";
+  if ( t == OriginalCall ) return "OriginalCall";
+  if ( t == Calling ) return "Calling";
+  return (char *)0;
+}
+
+PlayerFlags player_scan_PlayerFlags(const char *s) {
+  if ( strcmp(s,"Hidden") == 0 ) return Hidden;
+  if ( strcmp(s,"MahJongged") == 0 ) return MahJongged;
+  if ( strcmp(s,"HandDeclared") == 0 ) return HandDeclared;
+  if ( strcmp(s,"NoDiscard") == 0 ) return NoDiscard;
+  if ( strcmp(s,"OriginalCall") == 0 ) return OriginalCall;
+  if ( strcmp(s,"Calling") == 0 ) return Calling;
+  return -1;
+}
+
+
+char *player_print_DangerSignals(const DangerSignals t) {
+  if ( t == DangerBamboo ) return "DangerBamboo";
+  if ( t == DangerCharacter ) return "DangerCharacter";
+  if ( t == DangerCircle ) return "DangerCircle";
+  if ( t == DangerWind ) return "DangerWind";
+  if ( t == DangerDragon ) return "DangerDragon";
+  if ( t == DangerHonour ) return "DangerHonour";
+  if ( t == DangerGreen ) return "DangerGreen";
+  if ( t == DangerTerminal ) return "DangerTerminal";
+  if ( t == DangerEnd ) return "DangerEnd";
+  return (char *)0;
+}
+
+DangerSignals player_scan_DangerSignals(const char *s) {
+  if ( strcmp(s,"DangerBamboo") == 0 ) return DangerBamboo;
+  if ( strcmp(s,"DangerCharacter") == 0 ) return DangerCharacter;
+  if ( strcmp(s,"DangerCircle") == 0 ) return DangerCircle;
+  if ( strcmp(s,"DangerWind") == 0 ) return DangerWind;
+  if ( strcmp(s,"DangerDragon") == 0 ) return DangerDragon;
+  if ( strcmp(s,"DangerHonour") == 0 ) return DangerHonour;
+  if ( strcmp(s,"DangerGreen") == 0 ) return DangerGreen;
+  if ( strcmp(s,"DangerTerminal") == 0 ) return DangerTerminal;
+  if ( strcmp(s,"DangerEnd") == 0 ) return DangerEnd;
+  return -1;
+}
+
+
+char *player_print_ChowPosition(const ChowPosition t) {
+  if ( t == Lower ) return "Lower";
+  if ( t == Middle ) return "Middle";
+  if ( t == Upper ) return "Upper";
+  if ( t == AnyPos ) return "AnyPos";
+  return (char *)0;
+}
+
+ChowPosition player_scan_ChowPosition(const char *s) {
+  if ( strcmp(s,"Lower") == 0 ) return Lower;
+  if ( strcmp(s,"Middle") == 0 ) return Middle;
+  if ( strcmp(s,"Upper") == 0 ) return Upper;
+  if ( strcmp(s,"AnyPos") == 0 ) return AnyPos;
+  return -1;
+}
+
+
+char *player_print_MJSpecialHandFlags(const MJSpecialHandFlags t) {
+  if ( t == MJSevenPairs ) return "MJSevenPairs";
+  return (char *)0;
+}
+
+MJSpecialHandFlags player_scan_MJSpecialHandFlags(const char *s) {
+  if ( strcmp(s,"MJSevenPairs") == 0 ) return MJSevenPairs;
+  return -1;
+}
+
+
--- /dev/null
+++ b/player-enums.h
@@ -0,0 +1,18 @@
+char *player_print_TileSetType(const TileSetType t);
+TileSetType player_scan_TileSetType(const char *s);
+
+char *player_print_PlayerOption(const PlayerOption t);
+PlayerOption player_scan_PlayerOption(const char *s);
+
+char *player_print_PlayerFlags(const PlayerFlags t);
+PlayerFlags player_scan_PlayerFlags(const char *s);
+
+char *player_print_DangerSignals(const DangerSignals t);
+DangerSignals player_scan_DangerSignals(const char *s);
+
+char *player_print_ChowPosition(const ChowPosition t);
+ChowPosition player_scan_ChowPosition(const char *s);
+
+char *player_print_MJSpecialHandFlags(const MJSpecialHandFlags t);
+MJSpecialHandFlags player_scan_MJSpecialHandFlags(const char *s);
+
--- /dev/null
+++ b/pmsg_size.c
@@ -0,0 +1,1167 @@
+static int pmsg_size[] = {
+0,
+-sizeof(PMsgSaveStateMsg),
+-sizeof(PMsgLoadStateMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+-sizeof(PMsgConnectMsg),
+sizeof(PMsgRequestReconnectMsg),
+-sizeof(PMsgAuthInfoMsg),
+-sizeof(PMsgNewAuthInfoMsg),
+sizeof(PMsgDisconnectMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(PMsgDeclareSpecialMsg),
+0,
+0,
+-sizeof(PMsgRequestPauseMsg),
+sizeof(PMsgReadyMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(PMsgDiscardMsg),
+sizeof(PMsgNoClaimMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(PMsgPungMsg),
+0,
+sizeof(PMsgFormClosedPungMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(PMsgKongMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(PMsgDeclareClosedKongMsg),
+sizeof(PMsgAddToPungMsg),
+0,
+0,
+0,
+0,
+0,
+sizeof(PMsgQueryMahJongMsg),
+0,
+0,
+sizeof(PMsgChowMsg),
+0,
+sizeof(PMsgFormClosedChowMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(PMsgDeclareWashOutMsg),
+sizeof(PMsgMahJongMsg),
+0,
+sizeof(PMsgPairMsg),
+sizeof(PMsgFormClosedPairMsg),
+0,
+sizeof(PMsgShowTilesMsg),
+sizeof(PMsgSpecialSetMsg),
+sizeof(PMsgFormClosedSpecialSetMsg),
+0,
+0,
+-sizeof(PMsgSetPlayerOptionMsg),
+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,
+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,
+-sizeof(PMsgSetGameOptionMsg),
+sizeof(PMsgQueryGameOptionMsg),
+sizeof(PMsgListGameOptionsMsg),
+0,
+0,
+0,
+0,
+0,
+0,
+0,
+sizeof(PMsgChangeManagerMsg),
+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,
+-sizeof(PMsgSendMessageMsg),
+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,
+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,
+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,
+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,
+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,
+sizeof(PMsgSwapTileMsg),
+};
+
+int pmsg_size_of(PlayerMsgType t) { return pmsg_size[t]; }
+
+PMsgMsg *pmsg_deepcopy(PMsgMsg *m) {
+  PMsgMsg *n;
+  int size;
+  char *mc,*nc;
+
+  size = pmsg_size_of(m->type);
+  if ( size < 0 ) size *= -1;
+  n = (PMsgMsg *)malloc(size);
+  if ( ! n ) return n;
+
+  memcpy((void *)n,(const void *)m,size);
+  switch ( m->type ) {
+  case PMsgNewAuthInfo:
+    mc = ((PMsgNewAuthInfoMsg *)m)->authdata;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((PMsgNewAuthInfoMsg *)n)->authdata = nc;
+    break;
+  case PMsgAuthInfo:
+    mc = ((PMsgAuthInfoMsg *)m)->authdata;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((PMsgAuthInfoMsg *)n)->authdata = nc;
+    break;
+  case PMsgSendMessage:
+    mc = ((PMsgSendMessageMsg *)m)->text;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((PMsgSendMessageMsg *)n)->text = nc;
+    break;
+  case PMsgSetGameOption:
+    mc = ((PMsgSetGameOptionMsg *)m)->optvalue;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((PMsgSetGameOptionMsg *)n)->optvalue = nc;
+    break;
+  case PMsgSaveState:
+    mc = ((PMsgSaveStateMsg *)m)->filename;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((PMsgSaveStateMsg *)n)->filename = nc;
+    break;
+  case PMsgSetPlayerOption:
+    mc = ((PMsgSetPlayerOptionMsg *)m)->text;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((PMsgSetPlayerOptionMsg *)n)->text = nc;
+    break;
+  case PMsgLoadState:
+    mc = ((PMsgLoadStateMsg *)m)->filename;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((PMsgLoadStateMsg *)n)->filename = nc;
+    break;
+  case PMsgRequestPause:
+    mc = ((PMsgRequestPauseMsg *)m)->reason;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((PMsgRequestPauseMsg *)n)->reason = nc;
+    break;
+  case PMsgConnect:
+    mc = ((PMsgConnectMsg *)m)->name;
+    if ( mc ) {
+      nc = (char *)malloc(strlen(mc)+1);
+      if ( ! nc ) return NULL;
+      strcpy(nc,mc);
+    } else {
+      nc = NULL;
+    }
+    ((PMsgConnectMsg *)n)->name = nc;
+    break;
+  default:
+      ;
+  }
+  return n;
+}
+
+void pmsg_deepfree(PMsgMsg *m) {
+  switch ( m->type ) {
+  case PMsgNewAuthInfo:
+    if ( ((PMsgNewAuthInfoMsg *)m)->authdata )
+      free((void *)((PMsgNewAuthInfoMsg *)m)->authdata);
+    break;
+  case PMsgAuthInfo:
+    if ( ((PMsgAuthInfoMsg *)m)->authdata )
+      free((void *)((PMsgAuthInfoMsg *)m)->authdata);
+    break;
+  case PMsgSendMessage:
+    if ( ((PMsgSendMessageMsg *)m)->text )
+      free((void *)((PMsgSendMessageMsg *)m)->text);
+    break;
+  case PMsgSetGameOption:
+    if ( ((PMsgSetGameOptionMsg *)m)->optvalue )
+      free((void *)((PMsgSetGameOptionMsg *)m)->optvalue);
+    break;
+  case PMsgSaveState:
+    if ( ((PMsgSaveStateMsg *)m)->filename )
+      free((void *)((PMsgSaveStateMsg *)m)->filename);
+    break;
+  case PMsgSetPlayerOption:
+    if ( ((PMsgSetPlayerOptionMsg *)m)->text )
+      free((void *)((PMsgSetPlayerOptionMsg *)m)->text);
+    break;
+  case PMsgLoadState:
+    if ( ((PMsgLoadStateMsg *)m)->filename )
+      free((void *)((PMsgLoadStateMsg *)m)->filename);
+    break;
+  case PMsgRequestPause:
+    if ( ((PMsgRequestPauseMsg *)m)->reason )
+      free((void *)((PMsgRequestPauseMsg *)m)->reason);
+    break;
+  case PMsgConnect:
+    if ( ((PMsgConnectMsg *)m)->name )
+      free((void *)((PMsgConnectMsg *)m)->name);
+    break;
+  default:
+      ;
+  }
+  free((void *)m);
+}
+
--- /dev/null
+++ b/pmsg_union.h
@@ -0,0 +1,39 @@
+typedef union _PMsgUnion {
+  /* Note that this type field relies on the fact that all
+     messages have type as their first field */
+PlayerMsgType type;
+PMsgSaveStateMsg savestate;
+PMsgLoadStateMsg loadstate;
+PMsgConnectMsg connect;
+PMsgRequestReconnectMsg requestreconnect;
+PMsgAuthInfoMsg authinfo;
+PMsgNewAuthInfoMsg newauthinfo;
+PMsgDisconnectMsg disconnect;
+PMsgDeclareSpecialMsg declarespecial;
+PMsgRequestPauseMsg requestpause;
+PMsgReadyMsg ready;
+PMsgDiscardMsg discard;
+PMsgNoClaimMsg noclaim;
+PMsgPungMsg pung;
+PMsgFormClosedPungMsg formclosedpung;
+PMsgKongMsg kong;
+PMsgDeclareClosedKongMsg declareclosedkong;
+PMsgAddToPungMsg addtopung;
+PMsgQueryMahJongMsg querymahjong;
+PMsgChowMsg chow;
+PMsgFormClosedChowMsg formclosedchow;
+PMsgDeclareWashOutMsg declarewashout;
+PMsgMahJongMsg mahjong;
+PMsgPairMsg pair;
+PMsgFormClosedPairMsg formclosedpair;
+PMsgShowTilesMsg showtiles;
+PMsgSpecialSetMsg specialset;
+PMsgFormClosedSpecialSetMsg formclosedspecialset;
+PMsgSetPlayerOptionMsg setplayeroption;
+PMsgSetGameOptionMsg setgameoption;
+PMsgQueryGameOptionMsg querygameoption;
+PMsgListGameOptionsMsg listgameoptions;
+PMsgChangeManagerMsg changemanager;
+PMsgSendMessageMsg sendmessage;
+PMsgSwapTileMsg swaptile;
+} PMsgUnion;
--- /dev/null
+++ b/protocol-enums.c
@@ -0,0 +1,268 @@
+char *protocol_print_GameOption(const GameOption t) {
+  if ( t == GOUnknown ) return "Unknown";
+  if ( t == GOTimeout ) return "Timeout";
+  if ( t == GOTimeoutGrace ) return "TimeoutGrace";
+  if ( t == GOScoreLimit ) return "ScoreLimit";
+  if ( t == GONoLimit ) return "NoLimit";
+  if ( t == GOMahJongScore ) return "MahJongScore";
+  if ( t == GOSevenPairs ) return "SevenPairs";
+  if ( t == GOSevenPairsVal ) return "SevenPairsVal";
+  if ( t == GOFlowers ) return "Flowers";
+  if ( t == GOFlowersLoose ) return "FlowersLoose";
+  if ( t == GOFlowersOwnEach ) return "FlowersOwnEach";
+  if ( t == GOFlowersOwnBoth ) return "FlowersOwnBoth";
+  if ( t == GOFlowersBouquet ) return "FlowersBouquet";
+  if ( t == GODeadWall ) return "DeadWall";
+  if ( t == GODeadWall16 ) return "DeadWall16";
+  if ( t == GOConcealedFully ) return "ConcealedFully";
+  if ( t == GOConcealedAlmost ) return "ConcealedAlmost";
+  if ( t == GOLosersPurity ) return "LosersPurity";
+  if ( t == GOKongHas3Types ) return "KongHas3Types";
+  if ( t == GOEastDoubles ) return "EastDoubles";
+  if ( t == GOLosersSettle ) return "LosersSettle";
+  if ( t == GODiscDoubles ) return "DiscDoubles";
+  if ( t == GOShowOnWashout ) return "ShowOnWashout";
+  if ( t == GONumRounds ) return "NumRounds";
+  if ( t == GOEnd ) return "End";
+  return (char *)0;
+}
+
+GameOption protocol_scan_GameOption(const char *s) {
+  if ( strcmp(s,"Unknown") == 0 ) return GOUnknown;
+  if ( strcmp(s,"Timeout") == 0 ) return GOTimeout;
+  if ( strcmp(s,"TimeoutGrace") == 0 ) return GOTimeoutGrace;
+  if ( strcmp(s,"ScoreLimit") == 0 ) return GOScoreLimit;
+  if ( strcmp(s,"NoLimit") == 0 ) return GONoLimit;
+  if ( strcmp(s,"MahJongScore") == 0 ) return GOMahJongScore;
+  if ( strcmp(s,"SevenPairs") == 0 ) return GOSevenPairs;
+  if ( strcmp(s,"SevenPairsVal") == 0 ) return GOSevenPairsVal;
+  if ( strcmp(s,"Flowers") == 0 ) return GOFlowers;
+  if ( strcmp(s,"FlowersLoose") == 0 ) return GOFlowersLoose;
+  if ( strcmp(s,"FlowersOwnEach") == 0 ) return GOFlowersOwnEach;
+  if ( strcmp(s,"FlowersOwnBoth") == 0 ) return GOFlowersOwnBoth;
+  if ( strcmp(s,"FlowersBouquet") == 0 ) return GOFlowersBouquet;
+  if ( strcmp(s,"DeadWall") == 0 ) return GODeadWall;
+  if ( strcmp(s,"DeadWall16") == 0 ) return GODeadWall16;
+  if ( strcmp(s,"ConcealedFully") == 0 ) return GOConcealedFully;
+  if ( strcmp(s,"ConcealedAlmost") == 0 ) return GOConcealedAlmost;
+  if ( strcmp(s,"LosersPurity") == 0 ) return GOLosersPurity;
+  if ( strcmp(s,"KongHas3Types") == 0 ) return GOKongHas3Types;
+  if ( strcmp(s,"EastDoubles") == 0 ) return GOEastDoubles;
+  if ( strcmp(s,"LosersSettle") == 0 ) return GOLosersSettle;
+  if ( strcmp(s,"DiscDoubles") == 0 ) return GODiscDoubles;
+  if ( strcmp(s,"ShowOnWashout") == 0 ) return GOShowOnWashout;
+  if ( strcmp(s,"NumRounds") == 0 ) return GONumRounds;
+  if ( strcmp(s,"End") == 0 ) return GOEnd;
+  return -1;
+}
+
+
+char *protocol_print_GameOptionType(const GameOptionType t) {
+  if ( t == GOTBool ) return "bool";
+  if ( t == GOTInt ) return "int";
+  if ( t == GOTNat ) return "nat";
+  if ( t == GOTScore ) return "score";
+  if ( t == GOTString ) return "string";
+  return (char *)0;
+}
+
+GameOptionType protocol_scan_GameOptionType(const char *s) {
+  if ( strcmp(s,"bool") == 0 ) return GOTBool;
+  if ( strcmp(s,"int") == 0 ) return GOTInt;
+  if ( strcmp(s,"nat") == 0 ) return GOTNat;
+  if ( strcmp(s,"score") == 0 ) return GOTScore;
+  if ( strcmp(s,"string") == 0 ) return GOTString;
+  return -1;
+}
+
+
+char *protocol_print_ControllerMsgType(const ControllerMsgType t) {
+  if ( t == CMsgError ) return "CMsgError";
+  if ( t == CMsgInfoTiles ) return "CMsgInfoTiles";
+  if ( t == CMsgStateSaved ) return "CMsgStateSaved";
+  if ( t == CMsgConnectReply ) return "CMsgConnectReply";
+  if ( t == CMsgReconnect ) return "CMsgReconnect";
+  if ( t == CMsgAuthReqd ) return "CMsgAuthReqd";
+  if ( t == CMsgRedirect ) return "CMsgRedirect";
+  if ( t == CMsgPlayer ) return "CMsgPlayer";
+  if ( t == CMsgNewRound ) return "CMsgNewRound";
+  if ( t == CMsgGame ) return "CMsgGame";
+  if ( t == CMsgNewHand ) return "CMsgNewHand";
+  if ( t == CMsgPlayerDeclaresSpecial ) return "CMsgPlayerDeclaresSpecial";
+  if ( t == CMsgStartPlay ) return "CMsgStartPlay";
+  if ( t == CMsgStopPlay ) return "CMsgStopPlay";
+  if ( t == CMsgPause ) return "CMsgPause";
+  if ( t == CMsgPlayerReady ) return "CMsgPlayerReady";
+  if ( t == CMsgPlayerDraws ) return "CMsgPlayerDraws";
+  if ( t == CMsgPlayerDrawsLoose ) return "CMsgPlayerDrawsLoose";
+  if ( t == CMsgPlayerDiscards ) return "CMsgPlayerDiscards";
+  if ( t == CMsgClaimDenied ) return "CMsgClaimDenied";
+  if ( t == CMsgPlayerDoesntClaim ) return "CMsgPlayerDoesntClaim";
+  if ( t == CMsgDangerousDiscard ) return "CMsgDangerousDiscard";
+  if ( t == CMsgPlayerClaimsPung ) return "CMsgPlayerClaimsPung";
+  if ( t == CMsgPlayerPungs ) return "CMsgPlayerPungs";
+  if ( t == CMsgPlayerFormsClosedPung ) return "CMsgPlayerFormsClosedPung";
+  if ( t == CMsgPlayerClaimsKong ) return "CMsgPlayerClaimsKong";
+  if ( t == CMsgPlayerKongs ) return "CMsgPlayerKongs";
+  if ( t == CMsgPlayerDeclaresClosedKong ) return "CMsgPlayerDeclaresClosedKong";
+  if ( t == CMsgPlayerAddsToPung ) return "CMsgPlayerAddsToPung";
+  if ( t == CMsgPlayerRobsKong ) return "CMsgPlayerRobsKong";
+  if ( t == CMsgCanMahJong ) return "CMsgCanMahJong";
+  if ( t == CMsgPlayerClaimsChow ) return "CMsgPlayerClaimsChow";
+  if ( t == CMsgPlayerChows ) return "CMsgPlayerChows";
+  if ( t == CMsgPlayerFormsClosedChow ) return "CMsgPlayerFormsClosedChow";
+  if ( t == CMsgWashOut ) return "CMsgWashOut";
+  if ( t == CMsgPlayerClaimsMahJong ) return "CMsgPlayerClaimsMahJong";
+  if ( t == CMsgPlayerMahJongs ) return "CMsgPlayerMahJongs";
+  if ( t == CMsgPlayerPairs ) return "CMsgPlayerPairs";
+  if ( t == CMsgPlayerFormsClosedPair ) return "CMsgPlayerFormsClosedPair";
+  if ( t == CMsgPlayerShowsTiles ) return "CMsgPlayerShowsTiles";
+  if ( t == CMsgPlayerSpecialSet ) return "CMsgPlayerSpecialSet";
+  if ( t == CMsgPlayerFormsClosedSpecialSet ) return "CMsgPlayerFormsClosedSpecialSet";
+  if ( t == CMsgPlayerOptionSet ) return "CMsgPlayerOptionSet";
+  if ( t == CMsgHandScore ) return "CMsgHandScore";
+  if ( t == CMsgSettlement ) return "CMsgSettlement";
+  if ( t == CMsgGameOver ) return "CMsgGameOver";
+  if ( t == CMsgGameOption ) return "CMsgGameOption";
+  if ( t == CMsgChangeManager ) return "CMsgChangeManager";
+  if ( t == CMsgMessage ) return "CMsgMessage";
+  if ( t == CMsgWall ) return "CMsgWall";
+  if ( t == CMsgComment ) return "CMsgComment";
+  if ( t == CMsgSwapTile ) return "CMsgSwapTile";
+  return (char *)0;
+}
+
+ControllerMsgType protocol_scan_ControllerMsgType(const char *s) {
+  if ( strcmp(s,"CMsgError") == 0 ) return CMsgError;
+  if ( strcmp(s,"CMsgInfoTiles") == 0 ) return CMsgInfoTiles;
+  if ( strcmp(s,"CMsgStateSaved") == 0 ) return CMsgStateSaved;
+  if ( strcmp(s,"CMsgConnectReply") == 0 ) return CMsgConnectReply;
+  if ( strcmp(s,"CMsgReconnect") == 0 ) return CMsgReconnect;
+  if ( strcmp(s,"CMsgAuthReqd") == 0 ) return CMsgAuthReqd;
+  if ( strcmp(s,"CMsgRedirect") == 0 ) return CMsgRedirect;
+  if ( strcmp(s,"CMsgPlayer") == 0 ) return CMsgPlayer;
+  if ( strcmp(s,"CMsgNewRound") == 0 ) return CMsgNewRound;
+  if ( strcmp(s,"CMsgGame") == 0 ) return CMsgGame;
+  if ( strcmp(s,"CMsgNewHand") == 0 ) return CMsgNewHand;
+  if ( strcmp(s,"CMsgPlayerDeclaresSpecial") == 0 ) return CMsgPlayerDeclaresSpecial;
+  if ( strcmp(s,"CMsgStartPlay") == 0 ) return CMsgStartPlay;
+  if ( strcmp(s,"CMsgStopPlay") == 0 ) return CMsgStopPlay;
+  if ( strcmp(s,"CMsgPause") == 0 ) return CMsgPause;
+  if ( strcmp(s,"CMsgPlayerReady") == 0 ) return CMsgPlayerReady;
+  if ( strcmp(s,"CMsgPlayerDraws") == 0 ) return CMsgPlayerDraws;
+  if ( strcmp(s,"CMsgPlayerDrawsLoose") == 0 ) return CMsgPlayerDrawsLoose;
+  if ( strcmp(s,"CMsgPlayerDiscards") == 0 ) return CMsgPlayerDiscards;
+  if ( strcmp(s,"CMsgClaimDenied") == 0 ) return CMsgClaimDenied;
+  if ( strcmp(s,"CMsgPlayerDoesntClaim") == 0 ) return CMsgPlayerDoesntClaim;
+  if ( strcmp(s,"CMsgDangerousDiscard") == 0 ) return CMsgDangerousDiscard;
+  if ( strcmp(s,"CMsgPlayerClaimsPung") == 0 ) return CMsgPlayerClaimsPung;
+  if ( strcmp(s,"CMsgPlayerPungs") == 0 ) return CMsgPlayerPungs;
+  if ( strcmp(s,"CMsgPlayerFormsClosedPung") == 0 ) return CMsgPlayerFormsClosedPung;
+  if ( strcmp(s,"CMsgPlayerClaimsKong") == 0 ) return CMsgPlayerClaimsKong;
+  if ( strcmp(s,"CMsgPlayerKongs") == 0 ) return CMsgPlayerKongs;
+  if ( strcmp(s,"CMsgPlayerDeclaresClosedKong") == 0 ) return CMsgPlayerDeclaresClosedKong;
+  if ( strcmp(s,"CMsgPlayerAddsToPung") == 0 ) return CMsgPlayerAddsToPung;
+  if ( strcmp(s,"CMsgPlayerRobsKong") == 0 ) return CMsgPlayerRobsKong;
+  if ( strcmp(s,"CMsgCanMahJong") == 0 ) return CMsgCanMahJong;
+  if ( strcmp(s,"CMsgPlayerClaimsChow") == 0 ) return CMsgPlayerClaimsChow;
+  if ( strcmp(s,"CMsgPlayerChows") == 0 ) return CMsgPlayerChows;
+  if ( strcmp(s,"CMsgPlayerFormsClosedChow") == 0 ) return CMsgPlayerFormsClosedChow;
+  if ( strcmp(s,"CMsgWashOut") == 0 ) return CMsgWashOut;
+  if ( strcmp(s,"CMsgPlayerClaimsMahJong") == 0 ) return CMsgPlayerClaimsMahJong;
+  if ( strcmp(s,"CMsgPlayerMahJongs") == 0 ) return CMsgPlayerMahJongs;
+  if ( strcmp(s,"CMsgPlayerPairs") == 0 ) return CMsgPlayerPairs;
+  if ( strcmp(s,"CMsgPlayerFormsClosedPair") == 0 ) return CMsgPlayerFormsClosedPair;
+  if ( strcmp(s,"CMsgPlayerShowsTiles") == 0 ) return CMsgPlayerShowsTiles;
+  if ( strcmp(s,"CMsgPlayerSpecialSet") == 0 ) return CMsgPlayerSpecialSet;
+  if ( strcmp(s,"CMsgPlayerFormsClosedSpecialSet") == 0 ) return CMsgPlayerFormsClosedSpecialSet;
+  if ( strcmp(s,"CMsgPlayerOptionSet") == 0 ) return CMsgPlayerOptionSet;
+  if ( strcmp(s,"CMsgHandScore") == 0 ) return CMsgHandScore;
+  if ( strcmp(s,"CMsgSettlement") == 0 ) return CMsgSettlement;
+  if ( strcmp(s,"CMsgGameOver") == 0 ) return CMsgGameOver;
+  if ( strcmp(s,"CMsgGameOption") == 0 ) return CMsgGameOption;
+  if ( strcmp(s,"CMsgChangeManager") == 0 ) return CMsgChangeManager;
+  if ( strcmp(s,"CMsgMessage") == 0 ) return CMsgMessage;
+  if ( strcmp(s,"CMsgWall") == 0 ) return CMsgWall;
+  if ( strcmp(s,"CMsgComment") == 0 ) return CMsgComment;
+  if ( strcmp(s,"CMsgSwapTile") == 0 ) return CMsgSwapTile;
+  return -1;
+}
+
+
+char *protocol_print_PlayerMsgType(const PlayerMsgType t) {
+  if ( t == PMsgSaveState ) return "PMsgSaveState";
+  if ( t == PMsgLoadState ) return "PMsgLoadState";
+  if ( t == PMsgConnect ) return "PMsgConnect";
+  if ( t == PMsgRequestReconnect ) return "PMsgRequestReconnect";
+  if ( t == PMsgAuthInfo ) return "PMsgAuthInfo";
+  if ( t == PMsgNewAuthInfo ) return "PMsgNewAuthInfo";
+  if ( t == PMsgDisconnect ) return "PMsgDisconnect";
+  if ( t == PMsgDeclareSpecial ) return "PMsgDeclareSpecial";
+  if ( t == PMsgRequestPause ) return "PMsgRequestPause";
+  if ( t == PMsgReady ) return "PMsgReady";
+  if ( t == PMsgDiscard ) return "PMsgDiscard";
+  if ( t == PMsgNoClaim ) return "PMsgNoClaim";
+  if ( t == PMsgPung ) return "PMsgPung";
+  if ( t == PMsgFormClosedPung ) return "PMsgFormClosedPung";
+  if ( t == PMsgKong ) return "PMsgKong";
+  if ( t == PMsgDeclareClosedKong ) return "PMsgDeclareClosedKong";
+  if ( t == PMsgAddToPung ) return "PMsgAddToPung";
+  if ( t == PMsgQueryMahJong ) return "PMsgQueryMahJong";
+  if ( t == PMsgChow ) return "PMsgChow";
+  if ( t == PMsgFormClosedChow ) return "PMsgFormClosedChow";
+  if ( t == PMsgDeclareWashOut ) return "PMsgDeclareWashOut";
+  if ( t == PMsgMahJong ) return "PMsgMahJong";
+  if ( t == PMsgPair ) return "PMsgPair";
+  if ( t == PMsgFormClosedPair ) return "PMsgFormClosedPair";
+  if ( t == PMsgShowTiles ) return "PMsgShowTiles";
+  if ( t == PMsgSpecialSet ) return "PMsgSpecialSet";
+  if ( t == PMsgFormClosedSpecialSet ) return "PMsgFormClosedSpecialSet";
+  if ( t == PMsgSetPlayerOption ) return "PMsgSetPlayerOption";
+  if ( t == PMsgSetGameOption ) return "PMsgSetGameOption";
+  if ( t == PMsgQueryGameOption ) return "PMsgQueryGameOption";
+  if ( t == PMsgListGameOptions ) return "PMsgListGameOptions";
+  if ( t == PMsgChangeManager ) return "PMsgChangeManager";
+  if ( t == PMsgSendMessage ) return "PMsgSendMessage";
+  if ( t == PMsgSwapTile ) return "PMsgSwapTile";
+  return (char *)0;
+}
+
+PlayerMsgType protocol_scan_PlayerMsgType(const char *s) {
+  if ( strcmp(s,"PMsgSaveState") == 0 ) return PMsgSaveState;
+  if ( strcmp(s,"PMsgLoadState") == 0 ) return PMsgLoadState;
+  if ( strcmp(s,"PMsgConnect") == 0 ) return PMsgConnect;
+  if ( strcmp(s,"PMsgRequestReconnect") == 0 ) return PMsgRequestReconnect;
+  if ( strcmp(s,"PMsgAuthInfo") == 0 ) return PMsgAuthInfo;
+  if ( strcmp(s,"PMsgNewAuthInfo") == 0 ) return PMsgNewAuthInfo;
+  if ( strcmp(s,"PMsgDisconnect") == 0 ) return PMsgDisconnect;
+  if ( strcmp(s,"PMsgDeclareSpecial") == 0 ) return PMsgDeclareSpecial;
+  if ( strcmp(s,"PMsgRequestPause") == 0 ) return PMsgRequestPause;
+  if ( strcmp(s,"PMsgReady") == 0 ) return PMsgReady;
+  if ( strcmp(s,"PMsgDiscard") == 0 ) return PMsgDiscard;
+  if ( strcmp(s,"PMsgNoClaim") == 0 ) return PMsgNoClaim;
+  if ( strcmp(s,"PMsgPung") == 0 ) return PMsgPung;
+  if ( strcmp(s,"PMsgFormClosedPung") == 0 ) return PMsgFormClosedPung;
+  if ( strcmp(s,"PMsgKong") == 0 ) return PMsgKong;
+  if ( strcmp(s,"PMsgDeclareClosedKong") == 0 ) return PMsgDeclareClosedKong;
+  if ( strcmp(s,"PMsgAddToPung") == 0 ) return PMsgAddToPung;
+  if ( strcmp(s,"PMsgQueryMahJong") == 0 ) return PMsgQueryMahJong;
+  if ( strcmp(s,"PMsgChow") == 0 ) return PMsgChow;
+  if ( strcmp(s,"PMsgFormClosedChow") == 0 ) return PMsgFormClosedChow;
+  if ( strcmp(s,"PMsgDeclareWashOut") == 0 ) return PMsgDeclareWashOut;
+  if ( strcmp(s,"PMsgMahJong") == 0 ) return PMsgMahJong;
+  if ( strcmp(s,"PMsgPair") == 0 ) return PMsgPair;
+  if ( strcmp(s,"PMsgFormClosedPair") == 0 ) return PMsgFormClosedPair;
+  if ( strcmp(s,"PMsgShowTiles") == 0 ) return PMsgShowTiles;
+  if ( strcmp(s,"PMsgSpecialSet") == 0 ) return PMsgSpecialSet;
+  if ( strcmp(s,"PMsgFormClosedSpecialSet") == 0 ) return PMsgFormClosedSpecialSet;
+  if ( strcmp(s,"PMsgSetPlayerOption") == 0 ) return PMsgSetPlayerOption;
+  if ( strcmp(s,"PMsgSetGameOption") == 0 ) return PMsgSetGameOption;
+  if ( strcmp(s,"PMsgQueryGameOption") == 0 ) return PMsgQueryGameOption;
+  if ( strcmp(s,"PMsgListGameOptions") == 0 ) return PMsgListGameOptions;
+  if ( strcmp(s,"PMsgChangeManager") == 0 ) return PMsgChangeManager;
+  if ( strcmp(s,"PMsgSendMessage") == 0 ) return PMsgSendMessage;
+  if ( strcmp(s,"PMsgSwapTile") == 0 ) return PMsgSwapTile;
+  return -1;
+}
+
+
--- /dev/null
+++ b/protocol-enums.h
@@ -0,0 +1,12 @@
+char *protocol_print_GameOption(const GameOption t);
+GameOption protocol_scan_GameOption(const char *s);
+
+char *protocol_print_GameOptionType(const GameOptionType t);
+GameOptionType protocol_scan_GameOptionType(const char *s);
+
+char *protocol_print_ControllerMsgType(const ControllerMsgType t);
+ControllerMsgType protocol_scan_ControllerMsgType(const char *s);
+
+char *protocol_print_PlayerMsgType(const PlayerMsgType t);
+PlayerMsgType protocol_scan_PlayerMsgType(const char *s);
+
--- /dev/null
+++ b/tiles-enums.c
@@ -0,0 +1,91 @@
+char *tiles_print_TileSuit(const TileSuit t) {
+  if ( t == BambooSuit ) return "BambooSuit";
+  if ( t == CharacterSuit ) return "CharacterSuit";
+  if ( t == CircleSuit ) return "CircleSuit";
+  if ( t == WindSuit ) return "WindSuit";
+  if ( t == DragonSuit ) return "DragonSuit";
+  if ( t == FlowerSuit ) return "FlowerSuit";
+  if ( t == SeasonSuit ) return "SeasonSuit";
+  return (char *)0;
+}
+
+TileSuit tiles_scan_TileSuit(const char *s) {
+  if ( strcmp(s,"BambooSuit") == 0 ) return BambooSuit;
+  if ( strcmp(s,"CharacterSuit") == 0 ) return CharacterSuit;
+  if ( strcmp(s,"CircleSuit") == 0 ) return CircleSuit;
+  if ( strcmp(s,"WindSuit") == 0 ) return WindSuit;
+  if ( strcmp(s,"DragonSuit") == 0 ) return DragonSuit;
+  if ( strcmp(s,"FlowerSuit") == 0 ) return FlowerSuit;
+  if ( strcmp(s,"SeasonSuit") == 0 ) return SeasonSuit;
+  return -1;
+}
+
+
+char *tiles_print_TileWind(const TileWind t) {
+  if ( t == UnknownWind ) return "UnknownWind";
+  if ( t == EastWind ) return "EastWind";
+  if ( t == SouthWind ) return "SouthWind";
+  if ( t == WestWind ) return "WestWind";
+  if ( t == NorthWind ) return "NorthWind";
+  return (char *)0;
+}
+
+TileWind tiles_scan_TileWind(const char *s) {
+  if ( strcmp(s,"UnknownWind") == 0 ) return UnknownWind;
+  if ( strcmp(s,"EastWind") == 0 ) return EastWind;
+  if ( strcmp(s,"SouthWind") == 0 ) return SouthWind;
+  if ( strcmp(s,"WestWind") == 0 ) return WestWind;
+  if ( strcmp(s,"NorthWind") == 0 ) return NorthWind;
+  return -1;
+}
+
+
+char *tiles_print_TileDragon(const TileDragon t) {
+  if ( t == RedDragon ) return "RedDragon";
+  if ( t == WhiteDragon ) return "WhiteDragon";
+  if ( t == GreenDragon ) return "GreenDragon";
+  return (char *)0;
+}
+
+TileDragon tiles_scan_TileDragon(const char *s) {
+  if ( strcmp(s,"RedDragon") == 0 ) return RedDragon;
+  if ( strcmp(s,"WhiteDragon") == 0 ) return WhiteDragon;
+  if ( strcmp(s,"GreenDragon") == 0 ) return GreenDragon;
+  return -1;
+}
+
+
+char *tiles_print_TileFlower(const TileFlower t) {
+  if ( t == Plum ) return "Plum";
+  if ( t == Orchid ) return "Orchid";
+  if ( t == Chrysanthemum ) return "Chrysanthemum";
+  if ( t == Bamboo ) return "Bamboo";
+  return (char *)0;
+}
+
+TileFlower tiles_scan_TileFlower(const char *s) {
+  if ( strcmp(s,"Plum") == 0 ) return Plum;
+  if ( strcmp(s,"Orchid") == 0 ) return Orchid;
+  if ( strcmp(s,"Chrysanthemum") == 0 ) return Chrysanthemum;
+  if ( strcmp(s,"Bamboo") == 0 ) return Bamboo;
+  return -1;
+}
+
+
+char *tiles_print_TileSeason(const TileSeason t) {
+  if ( t == Spring ) return "Spring";
+  if ( t == Summer ) return "Summer";
+  if ( t == Autumn ) return "Autumn";
+  if ( t == Winter ) return "Winter";
+  return (char *)0;
+}
+
+TileSeason tiles_scan_TileSeason(const char *s) {
+  if ( strcmp(s,"Spring") == 0 ) return Spring;
+  if ( strcmp(s,"Summer") == 0 ) return Summer;
+  if ( strcmp(s,"Autumn") == 0 ) return Autumn;
+  if ( strcmp(s,"Winter") == 0 ) return Winter;
+  return -1;
+}
+
+
--- /dev/null
+++ b/tiles-enums.h
@@ -0,0 +1,15 @@
+char *tiles_print_TileSuit(const TileSuit t);
+TileSuit tiles_scan_TileSuit(const char *s);
+
+char *tiles_print_TileWind(const TileWind t);
+TileWind tiles_scan_TileWind(const char *s);
+
+char *tiles_print_TileDragon(const TileDragon t);
+TileDragon tiles_scan_TileDragon(const char *s);
+
+char *tiles_print_TileFlower(const TileFlower t);
+TileFlower tiles_scan_TileFlower(const char *s);
+
+char *tiles_print_TileSeason(const TileSeason t);
+TileSeason tiles_scan_TileSeason(const char *s);
+
